
<!doctype html>
<html lang="zh" class="no-js">
  <head>
    
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width,initial-scale=1">
      
      
      
      <link rel="icon" href="../img/favicon.ico">
      <meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.2.10">
    
    
      
        <title>安装部署 - RepChain V2.0</title>
      
    
    
      <link rel="stylesheet" href="../assets/stylesheets/main.df45aa19.min.css">
      
        
        <link rel="stylesheet" href="../assets/stylesheets/palette.9647289d.min.css">
        
      
    
    
    
      
        
        
        <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
        <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
        <style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
      
    
    
    <script>__md_scope=new URL("..",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
    
      

    
    
  </head>
  
  
    
    
      
    
    
    
    
    <body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="">
  
    
    
      <script>var palette=__md_get("__palette");if(palette&&"object"==typeof palette.color)for(var key of Object.keys(palette.color))document.body.setAttribute("data-md-color-"+key,palette.color[key])</script>
    
    <input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
    <input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
    <label class="md-overlay" for="__drawer"></label>
    <div data-md-component="skip">
      
        
        <a href="#repchain" class="md-skip">
          跳转至
        </a>
      
    </div>
    <div data-md-component="announce">
      
    </div>
    
    
      

<header class="md-header" data-md-component="header">
  <nav class="md-header__inner md-grid" aria-label="页眉">
    <a href=".." title="RepChain V2.0" class="md-header__button md-logo" aria-label="RepChain V2.0" data-md-component="logo">
      
  <img src="../img/favicon.ico" alt="logo">

    </a>
    <label class="md-header__button md-icon" for="__drawer">
      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
    </label>
    <div class="md-header__title" data-md-component="header-title">
      <div class="md-header__ellipsis">
        <div class="md-header__topic">
          <span class="md-ellipsis">
            RepChain V2.0
          </span>
        </div>
        <div class="md-header__topic" data-md-component="header-topic">
          <span class="md-ellipsis">
            
              安装部署
            
          </span>
        </div>
      </div>
    </div>
    
      <form class="md-header__option" data-md-component="palette">
        
          
          
          <input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent=""  aria-label="Switch to dark mode"  type="radio" name="__palette" id="__palette_1">
          
            <label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_2" hidden>
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m17.75 4.09-2.53 1.94.91 3.06-2.63-1.81-2.63 1.81.91-3.06-2.53-1.94L12.44 4l1.06-3 1.06 3 3.19.09m3.5 6.91-1.64 1.25.59 1.98-1.7-1.17-1.7 1.17.59-1.98L15.75 11l2.06-.05L18.5 9l.69 1.95 2.06.05m-2.28 4.95c.83-.08 1.72 1.1 1.19 1.85-.32.45-.66.87-1.08 1.27C15.17 23 8.84 23 4.94 19.07c-3.91-3.9-3.91-10.24 0-14.14.4-.4.82-.76 1.27-1.08.75-.53 1.93.36 1.85 1.19-.27 2.86.69 5.83 2.89 8.02a9.96 9.96 0 0 0 8.02 2.89m-1.64 2.02a12.08 12.08 0 0 1-7.8-3.47c-2.17-2.19-3.33-5-3.49-7.82-2.81 3.14-2.7 7.96.31 10.98 3.02 3.01 7.84 3.12 10.98.31Z"/></svg>
            </label>
          
        
          
          
          <input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="red" data-md-color-accent=""  aria-label="Switch to light mode"  type="radio" name="__palette" id="__palette_2">
          
            <label class="md-header__button md-icon" title="Switch to light mode" for="__palette_1" hidden>
              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 7a5 5 0 0 1 5 5 5 5 0 0 1-5 5 5 5 0 0 1-5-5 5 5 0 0 1 5-5m0 2a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0-7 2.39 3.42C13.65 5.15 12.84 5 12 5c-.84 0-1.65.15-2.39.42L12 2M3.34 7l4.16-.35A7.2 7.2 0 0 0 5.94 8.5c-.44.74-.69 1.5-.83 2.29L3.34 7m.02 10 1.76-3.77a7.131 7.131 0 0 0 2.38 4.14L3.36 17M20.65 7l-1.77 3.79a7.023 7.023 0 0 0-2.38-4.15l4.15.36m-.01 10-4.14.36c.59-.51 1.12-1.14 1.54-1.86.42-.73.69-1.5.83-2.29L20.64 17M12 22l-2.41-3.44c.74.27 1.55.44 2.41.44.82 0 1.63-.17 2.37-.44L12 22Z"/></svg>
            </label>
          
        
      </form>
    
    
    
      <label class="md-header__button md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
      </label>
      <div class="md-search" data-md-component="search" role="dialog">
  <label class="md-search__overlay" for="__search"></label>
  <div class="md-search__inner" role="search">
    <form class="md-search__form" name="search">
      <input type="text" class="md-search__input" name="query" aria-label="搜索" placeholder="搜索" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
      <label class="md-search__icon md-icon" for="__search">
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
      </label>
      <nav class="md-search__options" aria-label="查找">
        
        <button type="reset" class="md-search__icon md-icon" aria-label="清空当前内容" tabindex="-1">
          <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
        </button>
      </nav>
      
    </form>
    <div class="md-search__output">
      <div class="md-search__scrollwrap" data-md-scrollfix>
        <div class="md-search-result" data-md-component="search-result">
          <div class="md-search-result__meta">
            正在初始化搜索引擎
          </div>
          <ol class="md-search-result__list"></ol>
        </div>
      </div>
    </div>
  </div>
</div>
    
    
  </nav>
  
</header>
    
    <div class="md-container" data-md-component="container">
      
      
        
          
        
      
      <main class="md-main" data-md-component="main">
        <div class="md-main__inner md-grid">
          
            
              
              <div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    


<nav class="md-nav md-nav--primary" aria-label="导航栏" data-md-level="0">
  <label class="md-nav__title" for="__drawer">
    <a href=".." title="RepChain V2.0" class="md-nav__button md-logo" aria-label="RepChain V2.0" data-md-component="logo">
      
  <img src="../img/favicon.ico" alt="logo">

    </a>
    RepChain V2.0
  </label>
  
  <ul class="md-nav__list" data-md-scrollfix>
    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href=".." class="md-nav__link">
        首页
      </a>
    </li>
  

    
      
      
      

  
  
  
    <li class="md-nav__item">
      <a href="../RepChain-2.0/" class="md-nav__link">
        功能介绍
      </a>
    </li>
  

    
      
      
      

  
  
    
  
  
    <li class="md-nav__item md-nav__item--active">
      
      <input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
      
      
        
      
      
        <label class="md-nav__link md-nav__link--active" for="__toc">
          安装部署
          <span class="md-nav__icon md-icon"></span>
        </label>
      
      <a href="./" class="md-nav__link md-nav__link--active">
        安装部署
      </a>
      
        

<nav class="md-nav md-nav--secondary" aria-label="目录">
  
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      目录
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#_1" class="md-nav__link">
    ——单链模式
  </a>
  
    <nav class="md-nav" aria-label="——单链模式">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_2" class="md-nav__link">
    编译打包
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_3" class="md-nav__link">
    部署
  </a>
  
    <nav class="md-nav" aria-label="部署">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_4" class="md-nav__link">
    单机模拟多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_5" class="md-nav__link">
    分布式多机多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_6" class="md-nav__link">
    节点管理服务
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_7" class="md-nav__link">
    附录
  </a>
  
    <nav class="md-nav" aria-label="附录">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_8" class="md-nav__link">
    创世块的构建
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_9" class="md-nav__link">
    节点密钥替换
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#_10" class="md-nav__link">
    ——多链模式，业务链只负责业务
  </a>
  
    <nav class="md-nav" aria-label="——多链模式，业务链只负责业务">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_11" class="md-nav__link">
    编译打包
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_12" class="md-nav__link">
    部署
  </a>
  
    <nav class="md-nav" aria-label="部署">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_13" class="md-nav__link">
    单机模拟多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_14" class="md-nav__link">
    分布式多机多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_15" class="md-nav__link">
    节点管理服务
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_16" class="md-nav__link">
    附录
  </a>
  
    <nav class="md-nav" aria-label="附录">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_17" class="md-nav__link">
    创世块的构建
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_18" class="md-nav__link">
    节点密钥替换
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#_19" class="md-nav__link">
    ——多链模式，业务链管理操作权限并负责业务
  </a>
  
    <nav class="md-nav" aria-label="——多链模式，业务链管理操作权限并负责业务">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_20" class="md-nav__link">
    编译打包
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_21" class="md-nav__link">
    部署
  </a>
  
    <nav class="md-nav" aria-label="部署">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_22" class="md-nav__link">
    单机模拟多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_23" class="md-nav__link">
    分布式多机多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_24" class="md-nav__link">
    节点管理服务
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_25" class="md-nav__link">
    附录
  </a>
  
    <nav class="md-nav" aria-label="附录">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_26" class="md-nav__link">
    创世块的构建
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_27" class="md-nav__link">
    节点密钥替换
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
    </ul>
  
</nav>
      
    </li>
  

    
  </ul>
</nav>
                  </div>
                </div>
              </div>
            
            
              
              <div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
                <div class="md-sidebar__scrollwrap">
                  <div class="md-sidebar__inner">
                    

<nav class="md-nav md-nav--secondary" aria-label="目录">
  
  
  
    
  
  
    <label class="md-nav__title" for="__toc">
      <span class="md-nav__icon md-icon"></span>
      目录
    </label>
    <ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
      
        <li class="md-nav__item">
  <a href="#_1" class="md-nav__link">
    ——单链模式
  </a>
  
    <nav class="md-nav" aria-label="——单链模式">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_2" class="md-nav__link">
    编译打包
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_3" class="md-nav__link">
    部署
  </a>
  
    <nav class="md-nav" aria-label="部署">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_4" class="md-nav__link">
    单机模拟多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_5" class="md-nav__link">
    分布式多机多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_6" class="md-nav__link">
    节点管理服务
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_7" class="md-nav__link">
    附录
  </a>
  
    <nav class="md-nav" aria-label="附录">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_8" class="md-nav__link">
    创世块的构建
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_9" class="md-nav__link">
    节点密钥替换
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#_10" class="md-nav__link">
    ——多链模式，业务链只负责业务
  </a>
  
    <nav class="md-nav" aria-label="——多链模式，业务链只负责业务">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_11" class="md-nav__link">
    编译打包
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_12" class="md-nav__link">
    部署
  </a>
  
    <nav class="md-nav" aria-label="部署">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_13" class="md-nav__link">
    单机模拟多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_14" class="md-nav__link">
    分布式多机多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_15" class="md-nav__link">
    节点管理服务
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_16" class="md-nav__link">
    附录
  </a>
  
    <nav class="md-nav" aria-label="附录">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_17" class="md-nav__link">
    创世块的构建
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_18" class="md-nav__link">
    节点密钥替换
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
        <li class="md-nav__item">
  <a href="#_19" class="md-nav__link">
    ——多链模式，业务链管理操作权限并负责业务
  </a>
  
    <nav class="md-nav" aria-label="——多链模式，业务链管理操作权限并负责业务">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_20" class="md-nav__link">
    编译打包
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_21" class="md-nav__link">
    部署
  </a>
  
    <nav class="md-nav" aria-label="部署">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_22" class="md-nav__link">
    单机模拟多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_23" class="md-nav__link">
    分布式多机多节点
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_24" class="md-nav__link">
    节点管理服务
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_25" class="md-nav__link">
    附录
  </a>
  
    <nav class="md-nav" aria-label="附录">
      <ul class="md-nav__list">
        
          <li class="md-nav__item">
  <a href="#_26" class="md-nav__link">
    创世块的构建
  </a>
  
</li>
        
          <li class="md-nav__item">
  <a href="#_27" class="md-nav__link">
    节点密钥替换
  </a>
  
</li>
        
      </ul>
    </nav>
  
</li>
        
      </ul>
    </nav>
  
</li>
      
    </ul>
  
</nav>
                  </div>
                </div>
              </div>
            
          
          <div class="md-content" data-md-component="content">
            <article class="md-content__inner md-typeset">
              
                


<h1 id="repchain">RepChain部署</h1>
<h2 id="_1">——单链模式</h2>
<p>单链管理账户、证书以及操作权限，同时负责业务</p>
<p><img alt="auth-chain" src="../img/auth-chain.png" /></p>
<p>1.使用默认配置的levelDB</p>
<p>2.要构建创世块，运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo</code>，生成的创世块文件在<code>json/identity-net/genesis.json</code>（身份链）</p>
<ul>
<li>RepChain所支持的网络环境</li>
</ul>
<p>支持局域网、专网、公网部署，<code>NAT</code>或<code>docker</code>环境</p>
<ul>
<li>RepChain所支持的软硬件环境</li>
</ul>
<p>硬件环境：x86-64、Arm-64（如：鲲鹏服务器、树莓派）、RISK-V；软件环境：虚拟机、Docker</p>
<ul>
<li>部署和运行RepChain节点的方式</li>
</ul>
<p>使用<code>jar</code>包部署，运行在JVM上（jdk11+，推荐jdk13+），基于JAVA的跨平台部署，RepChain支持部署在绝大部分的Windows、Linux与MacOS系统上</p>
<ul>
<li>RepChain的单链部署模式</li>
</ul>
<blockquote>
<p>可以分为单机模拟多节点、分布式多机多节点、节点管理服务</p>
</blockquote>
<p>1.<strong>单机模拟多节点</strong></p>
<p>可以理解为一个进程中运行多个线程（节点），运行在同一宿主机上，一般在开发测试环境中使用该部署方式，用来测试RepChain代码或编写好的合约</p>
<p>2.<strong>分布式多机多节点</strong></p>
<p>可以理解为每个节点是一个进程，各个节点分别部署在不同的宿主机上</p>
<p>3.<strong>节点管理服务</strong></p>
<p>可以理解为一个进程中运行一个节点管理服务，可以在一个进程中运行多个线程（节点），也可以每个节点是一个进程</p>
<h3 id="_2">编译打包</h3>
<ul>
<li>环境需求：</li>
</ul>
<p>1.硬件的推荐配置：CPU：4核，Memory：8G，Disk：100G</p>
<blockquote>
<p>所述配置是推荐的<strong>基础运行环境</strong>的硬件配置，打包编译环境的配置可降低（可根据实际情况进行降低或提升配置）</p>
</blockquote>
<p>2.Java环境：Jdk-13，推荐<a href="https://www.azul.com/downloads/?version=java-13-mts&amp;architecture=x86-64-bit&amp;package=jdk">Azul-zuluJdk</a>，也可使用<a href="https://www.oracle.com/java/technologies/downloads/archive/">Oracle-Jdk</a></p>
<p>3.操作系统：可以安装Jdk-13的系统</p>
<p>4.支持架构：x86-64、Arm-64（如：鲲鹏服务器、树莓派），目前也支持：RISC-V；如果是Arm-64架构，则需要替换RepChain代码默认所依赖的leveldbjni的包，替换方式参见后续的介绍</p>
<p>5.<a href="https://git-scm.com/downloads">Git</a>：用来下载RepChain的源码（非必须，可直接下载<a href="https://gitee.com/BTAJL/repchain/repository/archive/RepChain_1.1.0_RC">压缩包</a>）</p>
<p>6.编译工具：<a href="https://www.scala-sbt.org/download.html">Sbt</a> ，安装方式见<a href="https://www.scala-sbt.org/1.x/docs/Setup.html">官方教程</a>；<font color=#FF0000 >或</font> 安装了<a href="https://plugins.jetbrains.com/plugin/1347-scala/versions/stable">Scala</a>插件的<a href="https://www.jetbrains.com/idea/download/#section=mac">IDEA</a>，插件安装方式见<a href="https://www.jetbrains.com/help/idea/managing-plugins.html#required-plugins">官方教程</a></p>
<ul>
<li>下载源码：</li>
</ul>
<p>1.如果有安装Git，且为Git配置了系统环境变量，则使用GitBash或者系统自带Terminal，依次输入如下命令：</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>     git clone https://gitee.com/BTAJL/repchain.git
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>     <span class="nb">cd</span> repchain
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>     git fetch
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>     git checkout -b dev_jdk13_2.0.0.0 RepChain_2.0.0_RC
</code></pre></div>
<blockquote>
<p>如不使用git，也可以直接下载<a href="https://gitee.com/BTAJL/repchain/repository/archive/RepChain_1.1.0_RC">压缩包</a>，并解压为repchain</p>
</blockquote>
<p>2.找到repchain根目录下的build.sbt文件，修改build.sbt中的<code>mainClass</code>（Jar包主类），如果部署模式为<a href="#单机模拟多节点">单机模拟多节点</a>，则修改为<code>rep.app.Repchain</code>，如果部署模式为<a href="#分布式多机多节点">分布式多机多节点</a>，则修改为<code>rep.app.Repchain_Single</code>，如果部署模式为<a href="#节点管理服务">节点管理服务</a>，则修改为<code>rep.app.RepChain_Management</code>，如下所示：</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>     <span class="c1"># 单机模拟多节点</span>
<a id="__codelineno-1-2" name="__codelineno-1-2" href="#__codelineno-1-2"></a>     mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.Repchain&quot;</span><span class="o">)</span>
<a id="__codelineno-1-3" name="__codelineno-1-3" href="#__codelineno-1-3"></a>     <span class="c1"># 或</span>
<a id="__codelineno-1-4" name="__codelineno-1-4" href="#__codelineno-1-4"></a>     <span class="c1"># 分布式多机多节点</span>
<a id="__codelineno-1-5" name="__codelineno-1-5" href="#__codelineno-1-5"></a>     mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.Repchain_Single&quot;</span><span class="o">)</span>
<a id="__codelineno-1-6" name="__codelineno-1-6" href="#__codelineno-1-6"></a>     <span class="c1"># 或</span>
<a id="__codelineno-1-7" name="__codelineno-1-7" href="#__codelineno-1-7"></a>     <span class="c1"># 节点管理服务</span>
<a id="__codelineno-1-8" name="__codelineno-1-8" href="#__codelineno-1-8"></a>     mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.RepChain_Management&quot;</span><span class="o">)</span>
</code></pre></div>
<blockquote>
<p>RepChain默认使用的<code>leveldbjni</code>包不支持Arm-64，因此如果要将RepChain部署在Arm-64架构的服务器，需要将根目录下的build.sbt文件中配置的<code>leveldb-jni</code>依赖包替换（可以自己根据<code>leveldb-jni</code>的说明文档自行编译），如下所示：</p>
</blockquote>
<div class="highlight"><pre><span></span><code><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>     <span class="c1"># 将</span>
<a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a>     <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;org.fusesource.leveldbjni&quot;</span> % <span class="s2">&quot;leveldbjni-all&quot;</span> % <span class="s2">&quot;1.8&quot;</span>
<a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>     <span class="c1"># 替换为</span>
<a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>     <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;com.github.huangtianhua&quot;</span> % <span class="s2">&quot;leveldbjni-linux64-aarch64&quot;</span> % <span class="s2">&quot;1.9&quot;</span>
<a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>     <span class="c1"># 或</span>
<a id="__codelineno-2-6" name="__codelineno-2-6" href="#__codelineno-2-6"></a>     <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;org.openlabtesting.leveldbjni&quot;</span> % <span class="s2">&quot;leveldbjni-linux64-aarch64&quot;</span> % <span class="s2">&quot;1.8&quot;</span>
</code></pre></div>
<p>3.编译并打包</p>
<blockquote>
<p>有两种方式，一种是在IDEA中使用<code>sbt-shell</code>（安装了Scala插件后，即可使用该工具），另一种是在终端使用<code>sbt-repl</code>（安装了Sbt后，即可使用该工具），详细说明过程可参考后面的打包演示：</p>
</blockquote>
<ul>
<li>在IDEA中打开<code>sbt shell</code>并进入交互界面后，依次输入如下命令：clean-&gt;compile-&gt;assembly，如下所示：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a>       sbt:RepChain&gt; clean 
<a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a>       sbt:RepChain&gt; compile 
<a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a>       sbt:RepChain&gt; assembly
</code></pre></div>
<ul>
<li>在终端中使用<code>sbt-repl</code>，输入<code>sbt</code>命令进入交互界面后，依次输入如下命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>       &gt; clean 
<a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a>       &gt; compile 
<a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>       &gt; assembly
</code></pre></div>
<p>4.打包好的RepChain.jar存放在<code>repchain/target/scala-2.12/RepChain.jar</code>，将Jar包移动到项目根目录下</p>
<ul>
<li>打包过程演示：</li>
</ul>
<p>1.使用IDEA中的<code>sbt-shell</code></p>
<p><img alt="sbt-shell-compile" src="../img/sbt-shell-compile.gif" /></p>
<p>2.使用终端（Terminal or cmd），下面以mac下的终端为例（Windows或Linux类似）</p>
<p><img alt="sbt-terminal-compile" src="../img/sbt-terminal-compile.gif" /></p>
<h3 id="_3">部署</h3>
<p>在上一小节中，主要叙述了如何对RepChain的源码进行了编译并打包得到RepChain.jar，接下来使用RepChain.jar来部署RepChain网络，RepChain的部署有三种方式：一是单机模拟多节点；二是分布式多机多节点；三是节点管理服务。接下来分别做详细介绍</p>
<h4 id="_4">单机模拟多节点</h4>
<blockquote>
<p>默认RepChain使用单机模拟身份链<strong>5</strong>节点，一般在开发测试环境中使用该部署方式，主要目的是用来测试RepChain代码或者编写好的合约，在同一个<code>Jvm</code>上模拟启动5个节点，启动主类为<code>rep.app.Repchain</code></p>
</blockquote>
<p><img alt="single-multi" src="../img/single-multi.jpg" /></p>
<ul>
<li>
<p>环境需求：</p>
<ul>
<li>硬件的基础配置：CPU：4核，Memory：8G</li>
<li>Java环境：Jdk-13，推荐<a href="https://www.azul.com/downloads/?version=java-13-mts&amp;architecture=x86-64-bit&amp;package=jdk">Azul-zuluJdk</a>，也可使用<a href="https://www.oracle.com/java/technologies/downloads/archive/">Oracle-Jdk</a></li>
</ul>
</li>
<li>
<p>配置文件</p>
</li>
</ul>
<blockquote>
<p>以node1为例（node2-node5类似），配置文件为<code>repchain/conf/121000005l35120456.node1/system.conf</code></p>
</blockquote>
<ul>
<li>
<p><code>system.conf</code>中需要注意的配置项</p>
<ul>
<li>1.<code>system.httpServicePort= 9081</code> ，RepChain的http服务的端口 </li>
<li>2.<code>system.contractOperationMode = 1</code>，以<code>jar</code>包模式运行RepChain，该配置项须改为1</li>
<li>3.<code>system.trans_create_type=0</code> ，接受从API提交过来的交易（如果设置为1，代表的是节点自动产生并提交交易，主要是用来测试用）</li>
<li>4.<code>sytetem.storage.dbpath</code>，leveldb存储位置</li>
<li>5.<code>sytetem.storage.blockpath</code>，block的文件存储位置</li>
</ul>
</li>
<li>
<p>启动方式为在终端下输入命令：</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a> <span class="c1"># 先前在打包环节已经指定了主类</span>
<a id="__codelineno-5-2" name="__codelineno-5-2" href="#__codelineno-5-2"></a>  java -jar RepChain.jar
</code></pre></div>
<p>或</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a> <span class="c1"># 指定主类</span>
<a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a> java -cp RepChain.jar rep.app.Repchain
</code></pre></div>
<ul>
<li>
<p>启动成功标志有两种验证方式</p>
<ul>
<li>通过API接口来验证。在浏览器中输入<code>http://localhost:9081/chaininfo/node</code>，如果返回结果中nodes数量为目前组网节点数量，则表示成功；或者是在终端中输入<code>curl http://localhost:9081/chaininfo/node</code>，如果返回结果中nodes数量为<strong>目前组网节点数量</strong>，则表示成功</li>
</ul>
<p><img alt="nodes-num" src="../img/nodes-num.png" /></p>
<ul>
<li>在浏览器中输入<code>http://localhost:9081/web/g1.html</code>，如果出现如下界面，可以看到如下图所示，红框中可以看到入网的节点，则标识成功</li>
</ul>
<p><img alt="front-end" src="../img/frontend.png" /></p>
</li>
<li>
<p><strong>可能出现的问题</strong></p>
<ul>
<li>
<p>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</p>
</li>
<li>
<p>磁盘空间不足的错误，有如下两个可能的原因：</p>
<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
<li>
<p>其他：如果想要在同一个JVM上模拟启动大于5个节点，即单机模拟6~N节点，在主类<code>rep.app.RepChain</code>中增加节点实例</p>
<ul>
<li>准备工作</li>
</ul>
<p>1.<code>jks/identity-net</code>目录下相应的节点密钥对与证书应是6~N个，仿照原有jks文件放置新生成的jks文件即可，可使用<a href="https://keystore-explorer.org/">Kse</a>或者<a href="https://gitee.com/BTAJL/repchain-tpldevelop/blob/master/src/main/scala/rep/jks/genjks/GenerateJks.java">代码</a>来生成节点密钥对和自签名证书，并将证书导入mytruststore.jks中，注意Jks文件名，以及其中存储的密钥对或者证书的别名，<code>***.nodex</code>，下图是Kse的简单使用示例</p>
<p><img alt="new-jks-1" src="../img/new-jks-1.png" /></p>
<p><img alt="new-jks-2" src="../img/new-jks-2.png" /></p>
<blockquote>
<p>注：其中mytruststore.jks中存放了身份链网络内所有节点的证书，如下图：</p>
</blockquote>
<p><img alt="new-jks-3" src="../img/new-jks-3.png" /></p>
<p>2.conf目录下为节点配置文件，新增节点node6-nodeN仿照node1-node5进行配置，需要额外注意以下配置项：</p>
<blockquote>
<p>1.<code>chain_cert_name = "identity-net:951002007l78123233.super_admin"</code>，单链模式下设置以<code>identity-net</code>身份链标识的管理员super_admin</p>
<p>2.<code>chain_network_id = "identity-net"</code>，组网id，单链模式下设置为<code>identity-net</code>，命名不能包含"_"这样的字符</p>
<p>3.<code>basic_chain_id = "identity-net"</code>，各种模式下均设置为<code>identity-net</code></p>
</blockquote>
<p>3.仿照node1-node5在主类<code>rep.app.RepChain</code>中增加node6-nodeN节点实例</p>
<p>4.编译打包以及部署的其他内容与前述一致</p>
<ul>
<li>启动方式</li>
</ul>
<blockquote>
<p>请查看源码<code>src/main/scala/rep/app/RepChain.scala</code></p>
</blockquote>
<div class="highlight"><pre><span></span><code><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>  java -cp RepChain.jar rep.app.RepChain
</code></pre></div>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（单机5节点）的目录类似下图，6~N节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书</p>
</blockquote>
<p><img alt="deploy-folder" src="../img/deploy-folder.png" /></p>
<h4 id="_5">分布式多机多节点</h4>
<blockquote>
<p>分布式多机多节点与单机多节点部署的原理是相同的，区别在于多机多节点是分别在不同服务器上部署RepChain.jar，然后组网连接成为分布式区块链网络。同一个<code>Jvm</code>上启动1个节点，启动主类为<code>rep.app.Repchain_Single</code></p>
</blockquote>
<p><img alt="multi-single" src="../img/multi-single.jpg" /></p>
<ul>
<li>网络部署</li>
</ul>
<p>可跨域、跨云进行去中心化部署，也可在专线、政务云上进行部署，单台服务器作为一个节点，节点服务器被各个机构各自维护</p>
<ul>
<li>
<p>启动方式以node1、node2的为例</p>
<ul>
<li>在node1所在主机的终端下输入命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a>java -jar RepChain.jar <span class="s2">&quot;121000005l35120456.node1&quot;</span> 
<a id="__codelineno-8-2" name="__codelineno-8-2" href="#__codelineno-8-2"></a><span class="c1"># 或指定主类</span>
<a id="__codelineno-8-3" name="__codelineno-8-3" href="#__codelineno-8-3"></a>java -cp RepChain.jar rep.app.Repchain_Single <span class="s2">&quot;121000005l35120456.node1&quot;</span>
</code></pre></div>
<ul>
<li>在node2所在主机的终端下输入命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a>java -jar RepChain.jar <span class="s2">&quot;12110107bi45jh675g.node2&quot;</span> 
<a id="__codelineno-9-2" name="__codelineno-9-2" href="#__codelineno-9-2"></a><span class="c1"># 或指定主类</span>
<a id="__codelineno-9-3" name="__codelineno-9-3" href="#__codelineno-9-3"></a>java -cp RepChain.jar rep.app.Repchain_Single <span class="s2">&quot;12110107bi45jh675g.node2&quot;</span>
</code></pre></div>
</li>
<li>
<p>ip与port的配置</p>
<ul>
<li>非<strong>NAT</strong>或非<strong>docker</strong>环境下使用如下配置（hostname为主机IP，port为节点之间P2P通信端口），修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-10-2" name="__codelineno-10-2" href="#__codelineno-10-2"></a><span class="w">    </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-10-3" name="__codelineno-10-3" href="#__codelineno-10-3"></a><span class="w">    </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-10-4" name="__codelineno-10-4" href="#__codelineno-10-4"></a><span class="w">        </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">局域网ip</span><span class="w"></span>
<a id="__codelineno-10-5" name="__codelineno-10-5" href="#__codelineno-10-5"></a><span class="w">        </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                   </span><span class="err">#</span><span class="w"> </span><span class="err">通信端口，可自由指定</span><span class="w"></span>
<a id="__codelineno-10-6" name="__codelineno-10-6" href="#__codelineno-10-6"></a><span class="w">    </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-10-7" name="__codelineno-10-7" href="#__codelineno-10-7"></a><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点网络中的3个节点的端口配置情况（种子节点&lt;seed-nodes>处配置3个即可，注意对应种子节点所配置的通信端口），其他节点的端口配置类似（其他节点主要是修改自己的<code>hostname</code>与<code>port</code>）</p>
<p><strong>注</strong>：种子节点指的是在网节点，如果创世节点启动，那么其种子节点配置项&lt;seed-nodes>配置自己的ip和port即可，如果是其他节点想要加入已经存在的网络，那么其种子节点的配置项&lt;seed-nodes>需要配置已经在网络中的节点的ip和端口</p>
<p><img alt="ip-port-1" src="../img/ip-port-1.jpg" /></p>
<p><img alt="ip-port-2" src="../img/ip-port-2.jpg" /></p>
<p><img alt="ip-port-3" src="../img/ip-port-3.jpg" /></p>
<ul>
<li><strong>NAT</strong>环境使用如下配置，针对上述图形中的artery部分修改即可，然后将种子节点设为相应节点的外部地址，修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-11-2" name="__codelineno-11-2" href="#__codelineno-11-2"></a><span class="w">    </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-11-3" name="__codelineno-11-3" href="#__codelineno-11-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-11-4" name="__codelineno-11-4" href="#__codelineno-11-4"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;139.10.1.3&quot;</span><span class="w">     </span><span class="err">#</span><span class="w"> </span><span class="err">外部地址</span><span class="w"></span>
<a id="__codelineno-11-5" name="__codelineno-11-5" href="#__codelineno-11-5"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                 </span><span class="err">#</span><span class="w"> </span><span class="err">外部端口</span><span class="w"></span>
<a id="__codelineno-11-6" name="__codelineno-11-6" href="#__codelineno-11-6"></a><span class="w">          </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">       </span><span class="err">#</span><span class="w"> </span><span class="err">局域网地址</span><span class="w"></span>
<a id="__codelineno-11-7" name="__codelineno-11-7" href="#__codelineno-11-7"></a><span class="w">          </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                      </span><span class="err">#</span><span class="w"> </span><span class="err">局域网端口</span><span class="w"></span>
<a id="__codelineno-11-8" name="__codelineno-11-8" href="#__codelineno-11-8"></a><span class="w">      </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-11-9" name="__codelineno-11-9" href="#__codelineno-11-9"></a><span class="w">  </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点网络中的<strong>3</strong>个节点的端口配置情况（种子节点处这里配置了<strong>1</strong>个），其他节点的端口配置类似（其他节点主要是修改自己的<strong>内部或外部</strong>的<code>hostname</code>与<code>port</code>）</p>
<p><img alt="ip-port-1" src="../img/ip-port-4.jpg" /></p>
<p><img alt="ip-port-5" src="../img/ip-port-5.jpg" /></p>
<p><img alt="ip-port-6" src="../img/ip-port-6.jpg" /></p>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（分布式多机多节点）的目录类似下图，以<code>node1</code>为例，其他节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书，各个服务器节点部署目录下mytruststore.jks一致</p>
</blockquote>
<p><img alt="deploy-single-folder" src="../img/deploy-single-folder.png" /></p>
<ul>
<li><strong>可能出现的问题</strong><ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>出现节点加入网络失败的情况<ul>
<li>可能是防火墙或者端口(种子节点或者本节点)没开放，可以手动查看或者使用nmap扫描对应的端口</li>
<li>可能是相应的节点证书没有放入到mytrustkeystore.jks，导致TLS连接失败</li>
</ul>
</li>
<li>磁盘空间不足的错误，有如下两个可能的原因<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="_6">节点管理服务</h4>
<blockquote>
<p>节点管理服务与单机多节点、分布式多机多节点部署的原理是相同的，可以在同一个<code>Jvm</code>上模拟启动5个节点，也可以分别在不同服务器上部署RepChain.jar，然后组网连接成为分布式区块链网络。满足一个进程中运行一个节点管理服务即可，启动主类为<code>rep.app.RepChain_Management</code></p>
</blockquote>
<ul>
<li>网络部署<ul>
<li>单链模式下默认RepChain使用单机模拟身份链<strong>5</strong>节点，一般在开发测试环境中使用该部署方式，主要目的是用来测试RepChain代码或者编写好的合约，在同一个<code>Jvm</code>上模拟启动5个节点</li>
<li>可跨域、跨云进行去中心化部署，也可在专线、政务云上进行部署，单台服务器作为一个节点，节点服务器被各个机构各自维护</li>
</ul>
</li>
<li>
<p>启动方式</p>
<ul>
<li>一个进程中运行一个节点管理服务，假设在一个服务器上有node1-node5，在其所在主机的终端下输入命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a>      java  -jar RepChain.jar <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;12110107bi45jh675g.node2&quot;</span> <span class="s2">&quot;122000002n00123567.node3&quot;</span> <span class="s2">&quot;921000005k36123789.node4&quot;</span>   <span class="s2">&quot;921000006e0012v696.node5&quot;</span> 
</code></pre></div>
</li>
<li>
<p>ip与port的配置</p>
<ul>
<li>非<strong>NAT</strong>或非<strong>docker</strong>环境下使用如下配置（hostname为主机IP，port为节点之间P2P通信端口），修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a><span class="w">   </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-13-2" name="__codelineno-13-2" href="#__codelineno-13-2"></a><span class="w">      </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-13-3" name="__codelineno-13-3" href="#__codelineno-13-3"></a><span class="w">       </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-13-4" name="__codelineno-13-4" href="#__codelineno-13-4"></a><span class="w">            </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">局域网ip</span><span class="w"></span>
<a id="__codelineno-13-5" name="__codelineno-13-5" href="#__codelineno-13-5"></a><span class="w">              </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                 </span><span class="err">#</span><span class="w"> </span><span class="err">通信端口，可自由指定</span><span class="w"></span>
<a id="__codelineno-13-6" name="__codelineno-13-6" href="#__codelineno-13-6"></a><span class="w">        </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-13-7" name="__codelineno-13-7" href="#__codelineno-13-7"></a><span class="w">    </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点网络中的3个节点的端口配置情况（种子节点&lt;seed-nodes>处配置3个即可，注意对应种子节点所配置的通信端口），其他节点的端口配置类似（其他节点主要是修改自己的<code>hostname</code>与<code>port</code>）</p>
<p><strong>注</strong>：种子节点指的是在网节点，如果创世节点启动，那么其种子节点配置项&lt;seed-nodes>配置自己的ip和port即可，如果是其他节点想要加入已经存在的网络，那么其种子节点的配置项&lt;seed-nodes>需要配置已经在网络中的节点的ip和端口</p>
<p><img alt="ip-port-1" src="../img/ip-port-1.jpg" /></p>
<p><img alt="ip-port-2" src="../img/ip-port-2.jpg" /></p>
<p><img alt="ip-port-3" src="../img/ip-port-3.jpg" /></p>
<ul>
<li><strong>NAT</strong>环境使用如下配置，针对上述图形中的artery部分修改即可，然后将种子节点设为相应节点的外部地址，修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-14-2" name="__codelineno-14-2" href="#__codelineno-14-2"></a><span class="w">    </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-14-3" name="__codelineno-14-3" href="#__codelineno-14-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-14-4" name="__codelineno-14-4" href="#__codelineno-14-4"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;139.10.1.3&quot;</span><span class="w">     </span><span class="err">#</span><span class="w"> </span><span class="err">外部地址</span><span class="w"></span>
<a id="__codelineno-14-5" name="__codelineno-14-5" href="#__codelineno-14-5"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                 </span><span class="err">#</span><span class="w"> </span><span class="err">外部端口</span><span class="w"></span>
<a id="__codelineno-14-6" name="__codelineno-14-6" href="#__codelineno-14-6"></a><span class="w">          </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">       </span><span class="err">#</span><span class="w"> </span><span class="err">局域网地址</span><span class="w"></span>
<a id="__codelineno-14-7" name="__codelineno-14-7" href="#__codelineno-14-7"></a><span class="w">          </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                      </span><span class="err">#</span><span class="w"> </span><span class="err">局域网端口</span><span class="w"></span>
<a id="__codelineno-14-8" name="__codelineno-14-8" href="#__codelineno-14-8"></a><span class="w">      </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-14-9" name="__codelineno-14-9" href="#__codelineno-14-9"></a><span class="w">  </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点网络中的<strong>3</strong>个节点的端口配置情况（种子节点处这里配置了<strong>1</strong>个），其他节点的端口配置类似（其他节点主要是修改自己的<strong>内部或外部</strong>的<code>hostname</code>与<code>port</code>）</p>
<p><img alt="ip-port-1" src="../img/ip-port-4.jpg" /></p>
<p><img alt="ip-port-5" src="../img/ip-port-5.jpg" /></p>
<p><img alt="ip-port-6" src="../img/ip-port-6.jpg" /></p>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（分布式多机多节点）的目录类似下图，以<code>node1</code>为例，其他节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书，各个服务器节点部署目录下mytruststore.jks一致</p>
</blockquote>
<p><img alt="deploy-single-folder" src="../img/deploy-single-folder.png" /></p>
<ul>
<li><strong>可能出现的问题</strong><ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>出现节点加入网络失败的情况<ul>
<li>可能是防火墙或者端口(种子节点或者本节点)没开放，可以手动查看或者使用nmap扫描对应的端口</li>
<li>可能是相应的节点证书没有放入到mytrustkeystore.jks，导致TLS连接失败</li>
</ul>
</li>
<li>磁盘空间不足的错误，有如下两个可能的原因<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="_7">附录</h3>
<h4 id="_8">创世块的构建</h4>
<p>要构建创世块，运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo</code>，生成的创世块文件在<code>json/identity-net/genesis.json</code>（身份链）</p>
<h4 id="_9">节点密钥替换</h4>
<p>默认为5节点，每个节点有一个密钥对，<strong>实际</strong>在生产环境部署RepChain需要更换开源仓库中的密钥，使用<a href="https://keystore-explorer.org/">KeyStoreExplorer</a>（或者使用<a href="https://gitee.com/BTAJL/ToolCollection/blob/master/src/main/java/repchain/genjks/GenerateJks.java">代码</a>）即可生成密钥对，导出证书</p>
<ol>
<li>为每个节点替换密钥，假设有5个节点，则使用<strong>kse</strong>生成5个包含密钥对（默认使用<code>secp256r1</code>）的<code>jks</code>并导出证书，更换<code>jks/identity-net</code>目录下的密钥与证书</li>
<li>使用<code>kse</code>将各个节点的证书导入到<code>mytrustStore.jks</code>中</li>
<li>运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo</code>，重新生成的创世块文件在<code>json/identity-net/genesis.json</code>（身份链）</li>
</ol>
<h2 id="_10">——多链模式，业务链只负责业务</h2>
<p>身份链管理账户、证书以及操作权限，业务链只负责业务</p>
<p><img alt="auth-single" src="../img/auth-single.png" /></p>
<p>1.要配置为共享levelDB</p>
<p>2.要分别构建身份链和业务链的创世块，运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo</code>（身份链）和<code>rep.utils.CreateGenesisInfo4NoTransaction</code>（业务链），生成的创世块文件分别在<code>json/identity-net/genesis.json</code>（身份链）和<code>json/credence-net/genesis.json</code>（业务链）</p>
<ul>
<li>RepChain所支持的网络环境</li>
</ul>
<p>支持局域网、专网、公网部署，<code>NAT</code>或<code>docker</code>环境</p>
<ul>
<li>RepChain所支持的软硬件环境</li>
</ul>
<p>硬件环境：x86-64、Arm-64（如：鲲鹏服务器、树莓派）、RISK-V；软件环境：虚拟机、Docker</p>
<ul>
<li>部署和运行RepChain节点的方式</li>
</ul>
<p>使用<code>jar</code>包部署，运行在JVM上（jdk11+，推荐jdk13+），基于JAVA的跨平台部署，RepChain支持部署在绝大部分的Windows、Linux与MacOS系统上</p>
<ul>
<li>RepChain的单链部署模式</li>
</ul>
<blockquote>
<p>可以分为单机模拟多节点、分布式多机多节点、节点管理服务</p>
</blockquote>
<p>1.<strong>单机模拟多节点</strong></p>
<p>可以理解为一个进程中运行多个线程（节点），运行在同一宿主机上，一般在开发测试环境中使用该部署方式，用来测试RepChain代码或编写好的合约</p>
<p>2.<strong>分布式多机多节点</strong></p>
<p>可以理解为每个节点是一个进程，各个节点分别部署在不同的宿主机上</p>
<p>3.<strong>节点管理服务</strong></p>
<p>可以理解为一个进程中运行一个节点管理服务，可以在一个进程中运行多个线程（节点），也可以每个节点是一个进程</p>
<h3 id="_11">编译打包</h3>
<ul>
<li>环境需求：</li>
</ul>
<p>1.硬件的推荐配置：CPU：4核，Memory：8G，Disk：100G</p>
<blockquote>
<p>所述配置是推荐的<strong>基础运行环境</strong>的硬件配置，打包编译环境的配置可降低（可根据实际情况进行降低或提升配置）</p>
</blockquote>
<p>2.Java环境：Jdk-13，推荐<a href="https://www.azul.com/downloads/?version=java-13-mts&amp;architecture=x86-64-bit&amp;package=jdk">Azul-zuluJdk</a>，也可使用<a href="https://www.oracle.com/java/technologies/downloads/archive/">Oracle-Jdk</a></p>
<p>3.操作系统：可以安装Jdk-13的系统</p>
<p>4.支持架构：x86-64、Arm-64（如：鲲鹏服务器、树莓派），目前也支持：RISC-V；如果是Arm-64架构，则需要替换RepChain代码默认所依赖的leveldbjni的包，替换方式参见后续的介绍</p>
<p>5.<a href="https://git-scm.com/downloads">Git</a>：用来下载RepChain的源码（非必须，可直接下载<a href="https://gitee.com/BTAJL/repchain/repository/archive/RepChain_1.1.0_RC">压缩包</a>）</p>
<p>6.编译工具：<a href="https://www.scala-sbt.org/download.html">Sbt</a> ，安装方式见<a href="https://www.scala-sbt.org/1.x/docs/Setup.html">官方教程</a>；<font color=#FF0000 >或</font> 安装了<a href="https://plugins.jetbrains.com/plugin/1347-scala/versions/stable">Scala</a>插件的<a href="https://www.jetbrains.com/idea/download/#section=mac">IDEA</a>，插件安装方式见<a href="https://www.jetbrains.com/help/idea/managing-plugins.html#required-plugins">官方教程</a></p>
<ul>
<li>下载源码：</li>
</ul>
<p>1.如果有安装Git，且为Git配置了系统环境变量，则使用GitBash或者系统自带Terminal，依次输入如下命令：</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a>   git clone https://gitee.com/BTAJL/repchain.git
<a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a>   <span class="nb">cd</span> repchain
<a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a>   git fetch
<a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a>   git checkout -b dev_jdk13_2.0.0.0 RepChain_2.0.0_RC
</code></pre></div>
<blockquote>
<p>如不使用git，也可以直接下载<a href="https://gitee.com/BTAJL/repchain/repository/archive/RepChain_1.1.0_RC">压缩包</a>，并解压为repchain</p>
</blockquote>
<p>2.找到repchain根目录下的build.sbt文件，修改build.sbt中的<code>mainClass</code>（Jar包主类），如果部署模式为<a href="#单机模拟多节点">单机模拟多节点</a>，则修改为<code>rep.app.Repchain</code>（主类<code>rep.app.Repchain</code>中默认只有node1-node5共5个节点，多链模式下仿照node1-node5在主类<code>rep.app.RepChain</code>中增加node6-nodeN节点实例），如果部署模式为<a href="#分布式多机多节点">分布式多机多节点</a>，则修改为<code>rep.app.Repchain_Single</code>，如果部署模式为<a href="#节点管理服务">节点管理服务</a>，则修改为<code>rep.app.RepChain_Management</code>，如下所示：</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>   <span class="c1"># 单机模拟多节点</span>
<a id="__codelineno-16-2" name="__codelineno-16-2" href="#__codelineno-16-2"></a>   mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.Repchain&quot;</span><span class="o">)</span>
<a id="__codelineno-16-3" name="__codelineno-16-3" href="#__codelineno-16-3"></a>   <span class="c1"># 或</span>
<a id="__codelineno-16-4" name="__codelineno-16-4" href="#__codelineno-16-4"></a>   <span class="c1"># 分布式多机多节点</span>
<a id="__codelineno-16-5" name="__codelineno-16-5" href="#__codelineno-16-5"></a>   mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.Repchain_Single&quot;</span><span class="o">)</span>
<a id="__codelineno-16-6" name="__codelineno-16-6" href="#__codelineno-16-6"></a>   <span class="c1"># 或</span>
<a id="__codelineno-16-7" name="__codelineno-16-7" href="#__codelineno-16-7"></a>   <span class="c1"># 节点管理服务</span>
<a id="__codelineno-16-8" name="__codelineno-16-8" href="#__codelineno-16-8"></a>   mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.RepChain_Management&quot;</span><span class="o">)</span>
</code></pre></div>
<blockquote>
<p>RepChain默认使用的<code>leveldbjni</code>包不支持Arm-64，因此如果要将RepChain部署在Arm-64架构的服务器，需要将根目录下的build.sbt文件中配置的<code>leveldb-jni</code>依赖包替换（可以自己根据<code>leveldb-jni</code>的说明文档自行编译），如下所示：</p>
</blockquote>
<div class="highlight"><pre><span></span><code><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a>   <span class="c1"># 将</span>
<a id="__codelineno-17-2" name="__codelineno-17-2" href="#__codelineno-17-2"></a>   <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;org.fusesource.leveldbjni&quot;</span> % <span class="s2">&quot;leveldbjni-all&quot;</span> % <span class="s2">&quot;1.8&quot;</span>
<a id="__codelineno-17-3" name="__codelineno-17-3" href="#__codelineno-17-3"></a>   <span class="c1"># 替换为</span>
<a id="__codelineno-17-4" name="__codelineno-17-4" href="#__codelineno-17-4"></a>   <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;com.github.huangtianhua&quot;</span> % <span class="s2">&quot;leveldbjni-linux64-aarch64&quot;</span> % <span class="s2">&quot;1.9&quot;</span>
<a id="__codelineno-17-5" name="__codelineno-17-5" href="#__codelineno-17-5"></a>   <span class="c1"># 或</span>
<a id="__codelineno-17-6" name="__codelineno-17-6" href="#__codelineno-17-6"></a>   <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;org.openlabtesting.leveldbjni&quot;</span> % <span class="s2">&quot;leveldbjni-linux64-aarch64&quot;</span> % <span class="s2">&quot;1.8&quot;</span>
</code></pre></div>
<p>3.编译并打包</p>
<blockquote>
<p>有两种方式，一种是在IDEA中使用<code>sbt-shell</code>（安装了Scala插件后，即可使用该工具），另一种是在终端使用<code>sbt-repl</code>（安装了Sbt后，即可使用该工具），详细说明过程可参考后面的打包演示：</p>
</blockquote>
<ul>
<li>在IDEA中打开<code>sbt shell</code>并进入交互界面后，依次输入如下命令：clean-&gt;compile-&gt;assembly，如下所示：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a>       sbt:RepChain&gt; clean 
<a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a>       sbt:RepChain&gt; compile 
<a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a>       sbt:RepChain&gt; assembly
</code></pre></div>
<ul>
<li>在终端中使用<code>sbt-repl</code>，输入<code>sbt</code>命令进入交互界面后，依次输入如下命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a>       &gt; clean 
<a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a>       &gt; compile 
<a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a>       &gt; assembly
</code></pre></div>
<p>4.打包好的RepChain.jar存放在<code>repchain/target/scala-2.12/RepChain.jar</code>，将Jar包移动到项目根目录下</p>
<ul>
<li>打包过程演示：</li>
</ul>
<p>1.使用IDEA中的<code>sbt-shell</code></p>
<p><img alt="sbt-shell-compile" src="../img/sbt-shell-compile.gif" /></p>
<p>2.使用终端（Terminal or cmd），下面以mac下的终端为例（Windows或Linux类似）</p>
<p><img alt="sbt-terminal-compile" src="../img/sbt-terminal-compile.gif" /></p>
<h3 id="_12">部署</h3>
<p>在上一小节中，主要叙述了如何对RepChain的源码进行了编译并打包得到RepChain.jar，接下来使用RepChain.jar来部署RepChain网络，RepChain的部署有三种方式：一是单机模拟多节点；二是分布式多机多节点；三是节点管理服务。接下来分别做详细介绍</p>
<h4 id="_13">单机模拟多节点</h4>
<blockquote>
<p>默认RepChain使用单机模拟身份链<strong>5</strong>节点和业务链<strong>5</strong>节点，一般在开发测试环境中使用该部署方式，主要目的是用来测试RepChain代码或者编写好的合约，在同一个<code>Jvm</code>上模拟启动10个节点，启动主类为<code>rep.app.Repchain</code></p>
</blockquote>
<p><img alt="single-multi" src="../img/single-multi.jpg" /></p>
<ul>
<li>
<p>环境需求：</p>
<ul>
<li>硬件的基础配置：CPU：4核，Memory：8G</li>
<li>Java环境：Jdk-13，推荐<a href="https://www.azul.com/downloads/?version=java-13-mts&amp;architecture=x86-64-bit&amp;package=jdk">Azul-zuluJdk</a>，也可使用<a href="https://www.oracle.com/java/technologies/downloads/archive/">Oracle-Jdk</a></li>
</ul>
</li>
<li>
<p>配置文件</p>
</li>
</ul>
<blockquote>
<p>身份链以node1为例（node2-node5类似），配置文件为<code>repchain/conf/121000005l35120456.node1/system.conf</code></p>
</blockquote>
<ul>
<li><code>system.conf</code>中需要注意的配置项<ul>
<li>1.<code>chain_cert_name = "identity-net:951002007l78123233.super_admin"</code>，身份链设置以<code>identity-net</code>标识的管理员super_admin</li>
<li>2.<code>chain_network_id = "identity-net"</code>，组网id，身份链设置为<code>identity-net</code>，命名不能包含"_"这样的字符</li>
<li>3.<code>basic_chain_id = "identity-net"</code>，身份链和业务链均设置为<code>identity-net</code>， 账户、证书由身份链管理</li>
<li>4.<code>system.httpServicePort= 9081</code> ，RepChain的http服务的端口</li>
<li>5.<code>system.contractOperationMode = 1</code>，以<code>jar</code>包模式运行RepChain，该配置项须改为1</li>
<li>6.<code>system.trans_create_type=0</code> ，接受从API提交过来的交易（如果设置为1，代表的是节点自动产生并提交交易，主要是用来测试用）</li>
<li>7.<code>sytetem.storage.dbpath</code>，leveldb存储位置，要与业务链配置为共享的</li>
<li>8.<code>sytetem.storage.blockpath</code>，block的文件存储位置，要与业务链配置为共享的</li>
</ul>
</li>
</ul>
<blockquote>
<p>业务链以node6为例（node7-node10类似），配置文件为<code>repchain/conf/330597659476689954.node6/system.conf</code></p>
</blockquote>
<ul>
<li>
<p><code>system.conf</code>中需要注意的配置项</p>
<ul>
<li>1.<code>chain_cert_name = "credence-net:951002007l78123233.super_admin"</code>，身份链设置以<code>credence-net</code>标识的管理员super_admin</li>
<li>2.<code>chain_network_id = "credence-net"</code>，组网id，业务链设置为<code>credence-net</code>，命名不能包含"_"这样的字符</li>
<li>3.<code>basic_chain_id = "identity-net"</code>，身份链和业务链均设置为<code>identity-net</code>， 账户、证书由身份链管理</li>
<li>4.<code>system.httpServicePort= 9086</code> ，RepChain的http服务的端口</li>
<li>5.<code>system.contractOperationMode = 1</code>，以<code>jar</code>包模式运行RepChain，该配置项须改为1</li>
<li>6.<code>system.trans_create_type=0</code> ，接受从API提交过来的交易（如果设置为1，代表的是节点自动产生并提交交易，主要是用来测试用）</li>
<li>7.<code>sytetem.storage.dbpath</code>，leveldb存储位置，要与身份链配置为共享的</li>
<li>8.<code>sytetem.storage.blockpath</code>，block的文件存储位置，要与身份链配置为共享的</li>
</ul>
</li>
<li>
<p>启动方式为在终端下输入命令：</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="c1"># 先前在打包环节已经指定了主类</span>
<a id="__codelineno-20-2" name="__codelineno-20-2" href="#__codelineno-20-2"></a>java -jar RepChain.jar
</code></pre></div>
<p>或</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="c1"># 指定主类</span>
<a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a>java -cp RepChain.jar rep.app.Repchain
</code></pre></div>
<ul>
<li>
<p>启动成功标志有两种验证方式</p>
<ul>
<li>通过API接口来验证。在浏览器中输入<code>http://localhost:9081/chaininfo/node</code>，如果返回结果中nodes数量为目前组网节点数量，则表示成功；或者是在终端中输入<code>curl http://localhost:9081/chaininfo/node</code>，如果返回结果中nodes数量为<strong>目前组网节点数量</strong>，则表示成功</li>
</ul>
<p><img alt="nodes-num" src="../img/nodes-num.png" /></p>
<ul>
<li>在浏览器中输入<code>http://localhost:9081/web/g1.html</code>，如果出现如下界面，可以看到如下图所示，红框中可以看到入网的节点，则标识成功</li>
</ul>
<p><img alt="front-end" src="../img/frontend.png" /></p>
</li>
<li>
<p><strong>可能出现的问题</strong></p>
<ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>磁盘空间不足的错误，有如下两个可能的原因：<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
<li>
<p>其他：如果想要在同一个JVM上模拟启动大于10个节点，即单机模拟身份链6~N节点或者业务链6~N节点，在主类<code>rep.app.RepChain</code>中增加节点实例</p>
<ul>
<li>准备工作</li>
</ul>
<p>1.<code>jks/identity-net</code>或者<code>jks/credence-net</code>目录下相应的节点密钥对与证书应是6~N个，仿照原有jks文件放置新生成的jks文件即可，可使用<a href="https://keystore-explorer.org/">Kse</a>或者<a href="https://gitee.com/BTAJL/repchain-tpldevelop/blob/master/src/main/scala/rep/jks/genjks/GenerateJks.java">代码</a>来生成节点密钥对和自签名证书，并将证书导入mytruststore.jks中，注意Jks文件名，以及其中存储的密钥对或者证书的别名，<code>***.nodex</code>，下图是Kse的简单使用示例</p>
<p><img alt="new-jks-1" src="../img/new-jks-1.png" /></p>
<p><img alt="new-jks-2" src="../img/new-jks-2.png" /></p>
<blockquote>
<p>注：其中mytruststore.jks中存放了身份链网络内所有节点的证书，如下图：</p>
</blockquote>
<p><img alt="new-jks-3" src="../img/new-jks-3.png" /></p>
<p>2.conf目录下为节点配置文件，身份链新增节点仿照node1-node5进行配置，业务链新增节点仿照node6-node10进行配置。</p>
<p>3.仿照node1-node5在主类<code>rep.app.RepChain</code>中增加节点实例。</p>
<ul>
<li>启动方式</li>
</ul>
<blockquote>
<p>请查看源码<code>src/main/scala/rep/app/RepChain.scala</code></p>
</blockquote>
<div class="highlight"><pre><span></span><code><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a>    java -cp RepChain.jar rep.app.RepChain
</code></pre></div>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（单机10节点）的目录类似下图，新增节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书</p>
</blockquote>
<p><img alt="deploy-folder" src="../img/deploy-multichain-folder.png" /></p>
<h4 id="_14">分布式多机多节点</h4>
<blockquote>
<p>分布式多机多节点与单机多节点部署的原理是相同的，区别在于多机多节点是分别在不同服务器上部署RepChain.jar，然后组网连接成为分布式区块链网络。同一个<code>Jvm</code>上启动2个节点分别参与身份链和业务链组网，启动主类为<code>rep.app.Repchain_Single</code></p>
</blockquote>
<p><img alt="multi-single" src="../img/multi-single.jpg" /></p>
<ul>
<li>
<p>网络部署及启动方式</p>
<ul>
<li>
<p>可跨域、跨云进行去中心化部署，也可在专线、政务云上进行部署，单台服务器作为一个节点，节点服务器被各个机构各自维护</p>
</li>
<li>
<p>启动方式以身份链节点node1和业务链节点node6为例，node1和node6需要部署在同一台服务器上，node1和node6的LevelDB（<code>system.conf</code>中<code>sytetem.storage.dbpath</code>和<code>sytetem.storage.blockpath</code>）配置为同一个存储目录：</p>
<ul>
<li>在node1和node6所在主机的终端下输入命令：</li>
</ul>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a>    java -jar RepChain.jar <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span>
<a id="__codelineno-23-2" name="__codelineno-23-2" href="#__codelineno-23-2"></a>    <span class="c1"># 或指定主类</span>
<a id="__codelineno-23-3" name="__codelineno-23-3" href="#__codelineno-23-3"></a>    java -cp RepChain.jar rep.app.Repchain_Single <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span> 
</code></pre></div>
</li>
<li>
<p>ip与port的配置</p>
<ul>
<li>非<strong>NAT</strong>或非<strong>docker</strong>环境下使用如下配置（hostname为主机IP，port为节点之间P2P通信端口），修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="w">    </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a><span class="w">        </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="w">        </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="w">            </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">局域网ip</span><span class="w"></span>
<a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="w">            </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                   </span><span class="err">#</span><span class="w"> </span><span class="err">通信端口，可自由指定</span><span class="w"></span>
<a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a><span class="w">        </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a><span class="w">    </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的3个节点的端口配置情况（种子节点\&lt;seed-nodes>处配置3个即可，注意对应种子节点所配置的通信端口），其他节点的端口配置类似（其他节点主要是修改自己的<code>hostname</code>与<code>port</code>）</p>
<p><strong>注</strong>：种子节点指的是在网节点，如果创世节点启动，那么其种子节点配置项\&lt;seed-nodes>配置自己的ip和port即可，如果是其他节点想要加入已经存在的网络，那么其种子节点的配置项\&lt;seed-nodes>需要配置已经在网络中的节点的ip和端口</p>
<p><img alt="ip-port-1" src="../img/ip-port-1.jpg" /></p>
<p><img alt="ip-port-2" src="../img/ip-port-2.jpg" /></p>
<p><img alt="ip-port-3" src="../img/ip-port-3.jpg" /></p>
<ul>
<li><strong>NAT</strong>环境使用如下配置，针对上述图形中的artery部分修改即可，然后将种子节点设为相应节点的外部地址，修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a><span class="w">      </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-25-2" name="__codelineno-25-2" href="#__codelineno-25-2"></a><span class="w">        </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-25-3" name="__codelineno-25-3" href="#__codelineno-25-3"></a><span class="w">          </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-25-4" name="__codelineno-25-4" href="#__codelineno-25-4"></a><span class="w">              </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;139.10.1.3&quot;</span><span class="w">     </span><span class="err">#</span><span class="w"> </span><span class="err">外部地址</span><span class="w"></span>
<a id="__codelineno-25-5" name="__codelineno-25-5" href="#__codelineno-25-5"></a><span class="w">              </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                 </span><span class="err">#</span><span class="w"> </span><span class="err">外部端口</span><span class="w"></span>
<a id="__codelineno-25-6" name="__codelineno-25-6" href="#__codelineno-25-6"></a><span class="w">              </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">       </span><span class="err">#</span><span class="w"> </span><span class="err">局域网地址</span><span class="w"></span>
<a id="__codelineno-25-7" name="__codelineno-25-7" href="#__codelineno-25-7"></a><span class="w">              </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                      </span><span class="err">#</span><span class="w"> </span><span class="err">局域网端口</span><span class="w"></span>
<a id="__codelineno-25-8" name="__codelineno-25-8" href="#__codelineno-25-8"></a><span class="w">          </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-25-9" name="__codelineno-25-9" href="#__codelineno-25-9"></a><span class="w">      </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的<strong>3</strong>个节点的端口配置情况（种子节点处这里配置了<strong>1</strong>个），其他节点的端口配置类似（其他节点主要是修改自己的<strong>内部或外部</strong>的<code>hostname</code>与<code>port</code>）</p>
<p><img alt="ip-port-1" src="../img/ip-port-4.jpg" /></p>
<p><img alt="ip-port-5" src="../img/ip-port-5.jpg" /></p>
<p><img alt="ip-port-6" src="../img/ip-port-6.jpg" /></p>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（分布式多机多节点）的目录类似下图，以<code>node1</code>和<code>node6</code>为例，其他节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书，各个服务器节点部署目录下mytruststore.jks一致</p>
</blockquote>
<p><img alt="deploy-single-folder" src="../img/deploy-multichain-single-folder.png" /></p>
<ul>
<li><strong>可能出现的问题</strong><ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>出现节点加入网络失败的情况<ul>
<li>可能是防火墙或者端口(种子节点或者本节点)没开放，可以手动查看或者使用nmap扫描对应的端口</li>
<li>可能是相应的节点证书没有放入到mytrustkeystore.jks，导致TLS连接失败</li>
</ul>
</li>
<li>磁盘空间不足的错误，有如下两个可能的原因<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="_15">节点管理服务</h4>
<blockquote>
<p>节点管理服务与单机多节点、分布式多机多节点部署的原理是相同的，可以在同一个<code>Jvm</code>上模拟启动10个节点，也可以分别在不同服务器上部署RepChain.jar，然后组网连接成为分布式区块链网络。满足一个进程中运行一个节点管理服务即可，启动主类为<code>rep.app.RepChain_Management</code></p>
</blockquote>
<p><img alt="multi-single" src="../img/multi-single.jpg" /></p>
<ul>
<li>
<p>网络部署及启动方式</p>
<ul>
<li>
<p>单链模式下默认RepChain使用单机模拟身份链<strong>5</strong>节点和业务链<strong>5</strong>节点，一般在开发测试环境中使用该部署方式，主要目的是用来测试RepChain代码或者编写好的合约，在同一个<code>Jvm</code>上模拟启动10个节点</p>
</li>
<li>
<p>可跨域、跨云进行去中心化部署，也可在专线、政务云上进行部署，单台服务器作为一个身份链节点和一个业务链节点，节点服务器被各个机构各自维护</p>
</li>
</ul>
</li>
<li>
<p>启动方式</p>
<ul>
<li>一个进程中运行一个节点管理服务，假设在一个服务器上有node1和node6，在其所在主机的终端下输入命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a>  java -jar RepChain.jar <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span> 
<a id="__codelineno-26-2" name="__codelineno-26-2" href="#__codelineno-26-2"></a>  <span class="c1"># 或指定主类</span>
<a id="__codelineno-26-3" name="__codelineno-26-3" href="#__codelineno-26-3"></a>  java -cp RepChain.jar rep.app.RepChain_Management <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span> 
</code></pre></div>
</li>
<li>
<p>ip与port的配置</p>
<ul>
<li>非<strong>NAT</strong>或非<strong>docker</strong>环境下使用如下配置（hostname为主机IP，port为节点之间P2P通信端口），修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a><span class="w">      </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">      </span><span class="err">#</span><span class="w"> </span><span class="err">局域网ip</span><span class="w"></span>
<a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                 </span><span class="err">#</span><span class="w"> </span><span class="err">通信端口，可自由指定</span><span class="w"></span>
<a id="__codelineno-27-6" name="__codelineno-27-6" href="#__codelineno-27-6"></a><span class="w">      </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-27-7" name="__codelineno-27-7" href="#__codelineno-27-7"></a><span class="w">  </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的3个节点的端口配置情况（种子节点&lt;seed-nodes>处配置3个即可，注意对应种子节点所配置的通信端口），其他节点的端口配置类似（其他节点主要是修改自己的<code>hostname</code>与<code>port</code>）</p>
<p><strong>注</strong>：种子节点指的是在网节点，如果创世节点启动，那么其种子节点配置项&lt;seed-nodes>配置自己的ip和port即可，如果是其他节点想要加入已经存在的网络，那么其种子节点的配置项&lt;seed-nodes>需要配置已经在网络中的节点的ip和端口</p>
<p><img alt="ip-port-1" src="../img/ip-port-1.jpg" /></p>
<p><img alt="ip-port-2" src="../img/ip-port-2.jpg" /></p>
<p><img alt="ip-port-3" src="../img/ip-port-3.jpg" /></p>
<ul>
<li><strong>NAT</strong>环境使用如下配置，针对上述图形中的artery部分修改即可，然后将种子节点设为相应节点的外部地址，修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="w">    </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a><span class="w">      </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a><span class="w">       </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a><span class="w">           </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;139.10.1.3&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">外部地址</span><span class="w"></span>
<a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a><span class="w">           </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                    </span><span class="err">#</span><span class="w"> </span><span class="err">外部端口</span><span class="w"></span>
<a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></a><span class="w">           </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">      </span><span class="err">#</span><span class="w"> </span><span class="err">局域网地址</span><span class="w"></span>
<a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-7"></a><span class="w">            </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                        </span><span class="err">#</span><span class="w"> </span><span class="err">局域网端口</span><span class="w"></span>
<a id="__codelineno-28-8" name="__codelineno-28-8" href="#__codelineno-28-8"></a><span class="w">        </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-28-9" name="__codelineno-28-9" href="#__codelineno-28-9"></a><span class="w">   </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的<strong>3</strong>个节点的端口配置情况（种子节点处这里配置了<strong>1</strong>个），其他节点的端口配置类似（其他节点主要是修改自己的<strong>内部或外部</strong>的<code>hostname</code>与<code>port</code>）</p>
<p><img alt="ip-port-1" src="../img/ip-port-4.jpg" /></p>
<p><img alt="ip-port-5" src="../img/ip-port-5.jpg" /></p>
<p><img alt="ip-port-6" src="../img/ip-port-6.jpg" /></p>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（分布式多机多节点）的目录类似下图，以<code>node1</code>和<code>node6</code>为例，其他节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书，各个服务器节点部署目录下mytruststore.jks一致</p>
</blockquote>
<p><img alt="deploy-single-folder" src="../img/deploy-multichain-single-folder.png" /></p>
<ul>
<li><strong>可能出现的问题</strong><ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>出现节点加入网络失败的情况<ul>
<li>可能是防火墙或者端口(种子节点或者本节点)没开放，可以手动查看或者使用nmap扫描对应的端口</li>
<li>可能是相应的节点证书没有放入到mytrustkeystore.jks，导致TLS连接失败</li>
</ul>
</li>
<li>磁盘空间不足的错误，有如下两个可能的原因<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="_16">附录</h3>
<h4 id="_17">创世块的构建</h4>
<p>要分别构建身份链和业务链的创世块，运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo</code>（身份链）和<code>rep.utils.CreateGenesisInfo4NoTransaction</code>（业务链），生成的创世块文件分别在<code>json/identity-net/genesis.json</code>（身份链）和<code>json/credence-net/genesis.json</code>（业务链）</p>
<h4 id="_18">节点密钥替换</h4>
<p>默认为5个身份链节点和5个业务链节点，每个节点有一个密钥对，<strong>实际</strong>在生产环境部署RepChain需要更换开源仓库中的密钥，使用<a href="https://keystore-explorer.org/">KeyStoreExplorer</a>（或者使用<a href="https://gitee.com/BTAJL/ToolCollection/blob/master/src/main/java/repchain/genjks/GenerateJks.java">代码</a>）即可生成密钥对，导出证书</p>
<ul>
<li>
<p>对于身份链</p>
<ul>
<li>1.为每个节点替换密钥，假设有5个节点，则使用<strong>kse</strong>生成5个包含密钥对（默认使用<code>secp256r1</code>）的<code>jks</code>并导出证书，更换<code>jks/identity-net</code>目录下的密钥与证书</li>
<li>2.使用<code>kse</code>将各个节点的证书导入到<code>mytrustStore.jks</code>中</li>
<li>3.运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo</code>，重新生成的身份链创世块文件在<code>json/identity-net/genesis.json</code>（身份链）</li>
</ul>
</li>
<li>
<p>对于业务链</p>
<ul>
<li>1.为每个节点替换密钥，假设有5个节点，则使用<strong>kse</strong>生成5个包含密钥对（默认使用<code>secp256r1</code>）的<code>jks</code>并导出证书，更换<code>jks/credence-net</code>目录下的密钥与证书</li>
<li>2.使用<code>kse</code>将各个节点的证书导入到<code>mytrustStore.jks</code>中</li>
<li>3.运行<code>src/main/scala</code>目录下<code>rep.utils.CreateGenesisInfo4NoTransaction</code>，重新生成的业务链创世块文件在<code>json/credence-net/genesis.json</code>（业务链）</li>
</ul>
</li>
</ul>
<h2 id="_19">——多链模式，业务链管理操作权限并负责业务</h2>
<p>身份链管理账户、证书，业务链管理操作权限并负责业务</p>
<p><img alt="auth-seperate" src="../img/auth-seperate.png" /></p>
<p>1.要配置为共享levelDB</p>
<p>2.要分别构建身份链和业务链的创世块，运行<code>src/main/scala</code>目录下<code>rep.utils.identity.CreateIdentityGenesisInfo</code> （身份链） 和<code>rep.utils.credence.CreateCredenceGenesisInfo</code>（业务链），生成的创世块文件分别在<code>json/identity-net/genesis.json</code>（身份链）和<code>json/credence-net/genesis.json</code>（业务链）</p>
<ul>
<li>RepChain所支持的网络环境</li>
</ul>
<p>支持局域网、专网、公网部署，<code>NAT</code>或<code>docker</code>环境</p>
<ul>
<li>RepChain所支持的软硬件环境</li>
</ul>
<p>硬件环境：x86-64、Arm-64（如：鲲鹏服务器、树莓派）、RISK-V；软件环境：虚拟机、Docker</p>
<ul>
<li>部署和运行RepChain节点的方式</li>
</ul>
<p>使用<code>jar</code>包部署，运行在JVM上（jdk11+，推荐jdk13+），基于JAVA的跨平台部署，RepChain支持部署在绝大部分的Windows、Linux与MacOS系统上</p>
<ul>
<li>RepChain的单链部署模式</li>
</ul>
<blockquote>
<p>可以分为单机模拟多节点、分布式多机多节点、节点管理服务</p>
</blockquote>
<ol>
<li>
<p><strong>单机模拟多节点</strong></p>
<p>可以理解为一个进程中运行多个线程（节点），运行在同一宿主机上，一般在开发测试环境中使用该部署方式，用来测试RepChain代码或编写好的合约</p>
</li>
<li>
<p><strong>分布式多机多节点</strong></p>
<p>可以理解为每个节点是一个进程，各个节点分别部署在不同的宿主机上</p>
</li>
<li>
<p><strong>节点管理服务</strong></p>
<p>可以理解为一个进程中运行一个节点管理服务，可以在一个进程中运行多个线程（节点），也可以每个节点是一个进程</p>
</li>
</ol>
<h3 id="_20">编译打包</h3>
<ul>
<li>环境需求：</li>
</ul>
<p>1.硬件的推荐配置：CPU：4核，Memory：8G，Disk：100G</p>
<blockquote>
<p>所述配置是推荐的<strong>基础运行环境</strong>的硬件配置，打包编译环境的配置可降低（可根据实际情况进行降低或提升配置）</p>
</blockquote>
<p>2.Java环境：Jdk-13，推荐<a href="https://www.azul.com/downloads/?version=java-13-mts&amp;architecture=x86-64-bit&amp;package=jdk">Azul-zuluJdk</a>，也可使用<a href="https://www.oracle.com/java/technologies/downloads/archive/">Oracle-Jdk</a></p>
<p>3.操作系统：可以安装Jdk-13的系统</p>
<p>4.支持架构：x86-64、Arm-64（如：鲲鹏服务器、树莓派），目前也支持：RISC-V；如果是Arm-64架构，则需要替换RepChain代码默认所依赖的leveldbjni的包，替换方式参见后续的介绍</p>
<p>5.<a href="https://git-scm.com/downloads">Git</a>：用来下载RepChain的源码（非必须，可直接下载<a href="https://gitee.com/BTAJL/repchain/repository/archive/RepChain_1.1.0_RC">压缩包</a>）</p>
<p>6.编译工具：<a href="https://www.scala-sbt.org/download.html">Sbt</a> ，安装方式见<a href="https://www.scala-sbt.org/1.x/docs/Setup.html">官方教程</a>；<font color=#FF0000 >或</font> 安装了<a href="https://plugins.jetbrains.com/plugin/1347-scala/versions/stable">Scala</a>插件的<a href="https://www.jetbrains.com/idea/download/#section=mac">IDEA</a>，插件安装方式见<a href="https://www.jetbrains.com/help/idea/managing-plugins.html#required-plugins">官方教程</a></p>
<ul>
<li>下载源码：</li>
</ul>
<p>1.如果有安装Git，且为Git配置了系统环境变量，则使用GitBash或者系统自带Terminal，依次输入如下命令：</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a>   git clone https://gitee.com/BTAJL/repchain.git
<a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a>   <span class="nb">cd</span> repchain
<a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a>   git fetch
<a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a>   git checkout -b dev_jdk13_2.0.0.0 RepChain_2.0.0_RC
</code></pre></div>
<blockquote>
<p>如不使用git，也可以直接下载<a href="https://gitee.com/BTAJL/repchain/repository/archive/RepChain_1.1.0_RC">压缩包</a>，并解压为repchain</p>
</blockquote>
<p>2.找到repchain根目录下的build.sbt文件，修改build.sbt中的<code>mainClass</code>（Jar包主类），如果部署模式为<a href="#单机模拟多节点">单机模拟多节点</a>，则修改为<code>rep.app.Repchain</code>（主类<code>rep.app.Repchain</code>中默认只有node1-node5共5个节点，多链模式下仿照node1-node5在主类<code>rep.app.RepChain</code>中增加node6-nodeN节点实例），如果部署模式为<a href="#分布式多机多节点">分布式多机多节点</a>，则修改为<code>rep.app.Repchain_Single</code>，如果部署模式为<a href="#节点管理服务">节点管理服务</a>，则修改为<code>rep.app.RepChain_Management</code>，如下所示：</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a>   <span class="c1"># 单机模拟多节点</span>
<a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a>   mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.Repchain&quot;</span><span class="o">)</span>
<a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a>   <span class="c1"># 或</span>
<a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a>   <span class="c1"># 分布式多机多节点</span>
<a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a>   mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.Repchain_Single&quot;</span><span class="o">)</span>
<a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a>   <span class="c1"># 或</span>
<a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a>   <span class="c1"># 节点管理服务</span>
<a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a>   mainClass <span class="k">in</span> <span class="o">(</span>Compile, packageBin<span class="o">)</span> :<span class="o">=</span> Some<span class="o">(</span><span class="s2">&quot;rep.app.RepChain_Management&quot;</span><span class="o">)</span>
</code></pre></div>
<blockquote>
<p>RepChain默认使用的<code>leveldbjni</code>包不支持Arm-64，因此如果要将RepChain部署在Arm-64架构的服务器，需要将根目录下的build.sbt文件中配置的<code>leveldb-jni</code>依赖包替换（可以自己根据<code>leveldb-jni</code>的说明文档自行编译），如下所示：</p>
</blockquote>
<div class="highlight"><pre><span></span><code><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a>   <span class="c1"># 将</span>
<a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a>   <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;org.fusesource.leveldbjni&quot;</span> % <span class="s2">&quot;leveldbjni-all&quot;</span> % <span class="s2">&quot;1.8&quot;</span>
<a id="__codelineno-31-3" name="__codelineno-31-3" href="#__codelineno-31-3"></a>   <span class="c1"># 替换为</span>
<a id="__codelineno-31-4" name="__codelineno-31-4" href="#__codelineno-31-4"></a>   <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;com.github.huangtianhua&quot;</span> % <span class="s2">&quot;leveldbjni-linux64-aarch64&quot;</span> % <span class="s2">&quot;1.9&quot;</span>
<a id="__codelineno-31-5" name="__codelineno-31-5" href="#__codelineno-31-5"></a>   <span class="c1"># 或</span>
<a id="__codelineno-31-6" name="__codelineno-31-6" href="#__codelineno-31-6"></a>   <span class="nv">libraryDependencies</span> <span class="o">+=</span> <span class="s2">&quot;org.openlabtesting.leveldbjni&quot;</span> % <span class="s2">&quot;leveldbjni-linux64-aarch64&quot;</span> % <span class="s2">&quot;1.8&quot;</span>
</code></pre></div>
<p>3.编译并打包</p>
<blockquote>
<p>有两种方式，一种是在IDEA中使用<code>sbt-shell</code>（安装了Scala插件后，即可使用该工具），另一种是在终端使用<code>sbt-repl</code>（安装了Sbt后，即可使用该工具），详细说明过程可参考后面的打包演示：</p>
</blockquote>
<ul>
<li>在IDEA中打开<code>sbt shell</code>并进入交互界面后，依次输入如下命令：clean-&gt;compile-&gt;assembly，如下所示：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a>     sbt:RepChain&gt; clean 
<a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a>     sbt:RepChain&gt; compile 
<a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a>     sbt:RepChain&gt; assembly
</code></pre></div>
<ul>
<li>在终端中使用<code>sbt-repl</code>，输入<code>sbt</code>命令进入交互界面后，依次输入如下命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a>     &gt; clean 
<a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a>     &gt; compile 
<a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-3"></a>     &gt; assembly
</code></pre></div>
<p>4.打包好的RepChain.jar存放在<code>repchain/target/scala-2.12/RepChain.jar</code>，将Jar包移动到项目根目录下</p>
<ul>
<li>打包过程演示：</li>
</ul>
<p>1.使用IDEA中的<code>sbt-shell</code></p>
<p><img alt="sbt-shell-compile" src="../img/sbt-shell-compile.gif" /></p>
<p>2.使用终端（Terminal or cmd），下面以mac下的终端为例（Windows或Linux类似）</p>
<p><img alt="sbt-terminal-compile" src="../img/sbt-terminal-compile.gif" /></p>
<h3 id="_21">部署</h3>
<p>在上一小节中，主要叙述了如何对RepChain的源码进行了编译并打包得到RepChain.jar，接下来使用RepChain.jar来部署RepChain网络，RepChain的部署有三种方式：一是单机模拟多节点；二是分布式多机多节点；三是节点管理服务。接下来分别做详细介绍</p>
<h4 id="_22">单机模拟多节点</h4>
<blockquote>
<p>默认RepChain使用单机模拟身份链<strong>5</strong>节点和业务链<strong>5</strong>节点，一般在开发测试环境中使用该部署方式，主要目的是用来测试RepChain代码或者编写好的合约，在同一个<code>Jvm</code>上模拟启动10个节点，启动主类为<code>rep.app.Repchain</code></p>
</blockquote>
<p><img alt="single-multi" src="../img/single-multi.jpg" /></p>
<ul>
<li>
<p>环境需求：</p>
<ul>
<li>硬件的基础配置：CPU：4核，Memory：8G</li>
<li>Java环境：Jdk-13，推荐<a href="https://www.azul.com/downloads/?version=java-13-mts&amp;architecture=x86-64-bit&amp;package=jdk">Azul-zuluJdk</a>，也可使用<a href="https://www.oracle.com/java/technologies/downloads/archive/">Oracle-Jdk</a></li>
</ul>
</li>
<li>
<p>配置文件</p>
</li>
</ul>
<blockquote>
<p>身份链以node1为例（node2-node5类似），配置文件为<code>repchain/conf/121000005l35120456.node1/system.conf</code></p>
</blockquote>
<ul>
<li><code>system.conf</code>中需要注意的配置项<ul>
<li>1.<code>chain_cert_name = "identity-net:951002007l78123233.super_admin"</code>，身份链设置以<code>identity-net</code>标识的管理员super_admin</li>
<li>2.<code>chain_network_id = "identity-net"</code>，组网id，身份链设置为<code>identity-net</code>，命名不能包含"_"这样的字符</li>
<li>3.<code>basic_chain_id = "identity-net"</code>，身份链和业务链均设置为<code>identity-net</code>， 账户、证书由身份链管理</li>
<li>4.<code>system.httpServicePort= 9081</code> ，RepChain的http服务的端口</li>
<li>5.<code>system.contractOperationMode = 1</code>，以<code>jar</code>包模式运行RepChain，该配置项须改为1</li>
<li>6.<code>system.trans_create_type=0</code> ，接受从API提交过来的交易（如果设置为1，代表的是节点自动产生并提交交易，主要是用来测试用）</li>
<li>7.<code>sytetem.storage.dbpath</code>，leveldb存储位置，要与业务链配置为共享的</li>
<li>8.<code>sytetem.storage.blockpath</code>，block的文件存储位置，要与业务链配置为共享的</li>
</ul>
</li>
</ul>
<blockquote>
<p>业务链以node6为例（node7-node10类似），配置文件为<code>repchain/conf/330597659476689954.node6/system.conf</code></p>
</blockquote>
<ul>
<li>
<p><code>system.conf</code>中需要注意的配置项</p>
<ul>
<li>1.<code>chain_cert_name = "credence-net:951002007l78123233.super_admin"</code>，身份链设置以<code>credence-net</code>标识的管理员super_admin</li>
<li>2.<code>chain_network_id = "credence-net"</code>，组网id，业务链设置为<code>credence-net</code>，命名不能包含"_"这样的字符</li>
<li>3.<code>basic_chain_id = "identity-net"</code>，身份链和业务链均设置为<code>identity-net</code>， 账户、证书由身份链管理</li>
<li>4.<code>system.httpServicePort= 9086</code> ，RepChain的http服务的端口</li>
<li>5.<code>system.contractOperationMode = 1</code>，以<code>jar</code>包模式运行RepChain，该配置项须改为1</li>
<li>6.<code>system.trans_create_type=0</code> ，接受从API提交过来的交易（如果设置为1，代表的是节点自动产生并提交交易，主要是用来测试用）</li>
<li>7.<code>sytetem.storage.dbpath</code>，leveldb存储位置，要与身份链配置为共享的</li>
<li>8.<code>sytetem.storage.blockpath</code>，block的文件存储位置，要与身份链配置为共享的</li>
</ul>
</li>
<li>
<p>启动方式为在终端下输入命令：</p>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a>  <span class="c1"># 先前在打包环节已经指定了主类</span>
<a id="__codelineno-34-2" name="__codelineno-34-2" href="#__codelineno-34-2"></a>  java -jar RepChain.jar
</code></pre></div>
<p>或</p>
<div class="highlight"><pre><span></span><code><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a>  <span class="c1"># 指定主类</span>
<a id="__codelineno-35-2" name="__codelineno-35-2" href="#__codelineno-35-2"></a>  java -cp RepChain.jar rep.app.Repchain
</code></pre></div>
<ul>
<li>
<p>启动成功标志有两种验证方式</p>
<ul>
<li>通过API接口来验证。在浏览器中输入<code>http://localhost:9081/chaininfo/node</code>，如果返回结果中nodes数量为目前组网节点数量，则表示成功；或者是在终端中输入<code>curl http://localhost:9081/chaininfo/node</code>，如果返回结果中nodes数量为<strong>目前组网节点数量</strong>，则表示成功</li>
</ul>
<p><img alt="nodes-num" src="../img/nodes-num.png" /></p>
<ul>
<li>在浏览器中输入<code>http://localhost:9081/web/g1.html</code>，如果出现如下界面，可以看到如下图所示，红框中可以看到入网的节点，则标识成功</li>
</ul>
<p><img alt="front-end" src="../img/frontend.png" /></p>
</li>
<li>
<p><strong>可能出现的问题</strong></p>
<ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>磁盘空间不足的错误，有如下两个可能的原因：<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
<li>
<p>其他：如果想要在同一个JVM上模拟启动大于10个节点，即单机模拟身份链6~N节点或者业务链6~N节点，在主类<code>rep.app.RepChain</code>中增加节点实例</p>
<ul>
<li>准备工作</li>
</ul>
<p>1.<code>jks/identity-net</code>或者<code>jks/credence-net</code>目录下相应的节点密钥对与证书应是6~N个，仿照原有jks文件放置新生成的jks文件即可，可使用<a href="https://keystore-explorer.org/">Kse</a>或者<a href="https://gitee.com/BTAJL/repchain-tpldevelop/blob/master/src/main/scala/rep/jks/genjks/GenerateJks.java">代码</a>来生成节点密钥对和自签名证书，并将证书导入mytruststore.jks中，注意Jks文件名，以及其中存储的密钥对或者证书的别名，<code>***.nodex</code>，下图是Kse的简单使用示例</p>
<p><img alt="new-jks-1" src="../img/new-jks-1.png" /></p>
<p><img alt="new-jks-2" src="../img/new-jks-2.png" /></p>
<blockquote>
<p>注：其中mytruststore.jks中存放了身份链网络内所有节点的证书，如下图：</p>
</blockquote>
<p><img alt="new-jks-3" src="../img/new-jks-3.png" /></p>
<p>2.conf目录下为节点配置文件，身份链新增节点仿照node1-node5进行配置，业务链新增节点仿照node6-node10进行配置。</p>
<p>3.仿照node1-node5在主类<code>rep.app.RepChain</code>中增加节点实例。</p>
<ul>
<li>启动方式</li>
</ul>
<blockquote>
<p>请查看源码<code>src/main/scala/rep/app/RepChain.scala</code></p>
</blockquote>
<div class="highlight"><pre><span></span><code><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a> java -cp RepChain.jar rep.app.RepChain
</code></pre></div>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（单机10节点）的目录类似下图，新增节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书</p>
</blockquote>
<p><img alt="deploy-folder" src="../img/deploy-multichain-folder.png" /></p>
<h4 id="_23">分布式多机多节点</h4>
<blockquote>
<p>分布式多机多节点与单机多节点部署的原理是相同的，区别在于多机多节点是分别在不同服务器上部署RepChain.jar，然后组网连接成为分布式区块链网络。同一个<code>Jvm</code>上启动2个节点分别参与身份链和业务链组网，启动主类为<code>rep.app.Repchain_Single</code></p>
</blockquote>
<p><img alt="multi-single" src="../img/multi-single.jpg" /></p>
<ul>
<li>
<p>网络部署及启动方式</p>
<ul>
<li>
<p>可跨域、跨云进行去中心化部署，也可在专线、政务云上进行部署，单台服务器作为一个节点，节点服务器被各个机构各自维护</p>
</li>
<li>
<p>启动方式以身份链节点node1和业务链节点node6为例，node1和node6需要部署在同一台服务器上，node1和node6的LevelDB（<code>system.conf</code>中<code>sytetem.storage.dbpath</code>和<code>sytetem.storage.blockpath</code>）配置为同一个存储目录：</p>
<ul>
<li>在node1和node6所在主机的终端下输入命令：</li>
</ul>
</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-37-1" name="__codelineno-37-1" href="#__codelineno-37-1"></a>    java -jar RepChain.jar <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span>
<a id="__codelineno-37-2" name="__codelineno-37-2" href="#__codelineno-37-2"></a>      <span class="c1"># 或指定主类</span>
<a id="__codelineno-37-3" name="__codelineno-37-3" href="#__codelineno-37-3"></a>     java -cp RepChain.jar rep.app.Repchain_Single <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span> 
</code></pre></div>
</li>
<li>
<p>ip与port的配置</p>
<ul>
<li>非<strong>NAT</strong>或非<strong>docker</strong>环境下使用如下配置（hostname为主机IP，port为节点之间P2P通信端口），修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-38-2" name="__codelineno-38-2" href="#__codelineno-38-2"></a><span class="w">      </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-38-3" name="__codelineno-38-3" href="#__codelineno-38-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-38-4" name="__codelineno-38-4" href="#__codelineno-38-4"></a><span class="w">        </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">局域网ip</span><span class="w"></span>
<a id="__codelineno-38-5" name="__codelineno-38-5" href="#__codelineno-38-5"></a><span class="w">        </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                   </span><span class="err">#</span><span class="w"> </span><span class="err">通信端口，可自由指定</span><span class="w"></span>
<a id="__codelineno-38-6" name="__codelineno-38-6" href="#__codelineno-38-6"></a><span class="w">     </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-38-7" name="__codelineno-38-7" href="#__codelineno-38-7"></a><span class="w"> </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的3个节点的端口配置情况（种子节点&lt;seed-nodes>处配置3个即可，注意对应种子节点所配置的通信端口），其他节点的端口配置类似（其他节点主要是修改自己的<code>hostname</code>与<code>port</code>）</p>
<p><strong>注</strong>：种子节点指的是在网节点，如果创世节点启动，那么其种子节点配置项&lt;seed-nodes>配置自己的ip和port即可，如果是其他节点想要加入已经存在的网络，那么其种子节点的配置项&lt;seed-nodes>需要配置已经在网络中的节点的ip和端口</p>
<p><img alt="ip-port-1" src="../img/ip-port-1.jpg" /></p>
<p><img alt="ip-port-2" src="../img/ip-port-2.jpg" /></p>
<p><img alt="ip-port-3" src="../img/ip-port-3.jpg" /></p>
<ul>
<li><strong>NAT</strong>环境使用如下配置，针对上述图形中的artery部分修改即可，然后将种子节点设为相应节点的外部地址，修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a><span class="w">      </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a><span class="w">         </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;139.10.1.3&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">外部地址</span><span class="w"></span>
<a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="w">         </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                    </span><span class="err">#</span><span class="w"> </span><span class="err">外部端口</span><span class="w"></span>
<a id="__codelineno-39-6" name="__codelineno-39-6" href="#__codelineno-39-6"></a><span class="w">          </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">     </span><span class="err">#</span><span class="w"> </span><span class="err">局域网地址</span><span class="w"></span>
<a id="__codelineno-39-7" name="__codelineno-39-7" href="#__codelineno-39-7"></a><span class="w">         </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                     </span><span class="err">#</span><span class="w"> </span><span class="err">局域网端口</span><span class="w"></span>
<a id="__codelineno-39-8" name="__codelineno-39-8" href="#__codelineno-39-8"></a><span class="w">     </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-39-9" name="__codelineno-39-9" href="#__codelineno-39-9"></a><span class="w"> </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的<strong>3</strong>个节点的端口配置情况（种子节点处这里配置了<strong>1</strong>个），其他节点的端口配置类似（其他节点主要是修改自己的<strong>内部或外部</strong>的<code>hostname</code>与<code>port</code>）</p>
<p><img alt="ip-port-1" src="../img/ip-port-4.jpg" /></p>
<p><img alt="ip-port-5" src="../img/ip-port-5.jpg" /></p>
<p><img alt="ip-port-6" src="../img/ip-port-6.jpg" /></p>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（分布式多机多节点）的目录类似下图，以<code>node1</code>和<code>node6</code>为例，其他节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书，各个服务器节点部署目录下mytruststore.jks一致</p>
</blockquote>
<p><img alt="deploy-single-folder" src="../img/deploy-multichain-single-folder.png" /></p>
<ul>
<li><strong>可能出现的问题</strong><ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>出现节点加入网络失败的情况<ul>
<li>可能是防火墙或者端口(种子节点或者本节点)没开放，可以手动查看或者使用nmap扫描对应的端口</li>
<li>可能是相应的节点证书没有放入到mytrustkeystore.jks，导致TLS连接失败</li>
</ul>
</li>
<li>磁盘空间不足的错误，有如下两个可能的原因<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="_24">节点管理服务</h4>
<blockquote>
<p>节点管理服务与单机多节点、分布式多机多节点部署的原理是相同的，可以在同一个<code>Jvm</code>上模拟启动10个节点，也可以分别在不同服务器上部署RepChain.jar，然后组网连接成为分布式区块链网络。满足一个进程中运行一个节点管理服务即可，启动主类为<code>rep.app.RepChain_Management</code></p>
</blockquote>
<p><img alt="multi-single" src="../img/multi-single.jpg" /></p>
<ul>
<li>
<p>网络部署</p>
<ul>
<li>
<p>单链模式下默认RepChain使用单机模拟身份链<strong>5</strong>节点和业务链<strong>5</strong>节点，一般在开发测试环境中使用该部署方式，主要目的是用来测试RepChain代码或者编写好的合约，在同一个<code>Jvm</code>上模拟启动10个节点</p>
</li>
<li>
<p>可跨域、跨云进行去中心化部署，也可在专线、政务云上进行部署，单台服务器作为一个身份链节点和一个业务链节点，节点服务器被各个机构各自维护</p>
</li>
</ul>
</li>
<li>
<p>启动方式</p>
<ul>
<li>一个进程中运行一个节点管理服务，假设在一个服务器上有node1和node6，在其所在主机的终端下输入命令：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a>   java -jar RepChain.jar <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span> 
<a id="__codelineno-40-2" name="__codelineno-40-2" href="#__codelineno-40-2"></a>   <span class="c1"># 或指定主类</span>
<a id="__codelineno-40-3" name="__codelineno-40-3" href="#__codelineno-40-3"></a>   java -cp RepChain.jar rep.app.RepChain_Management <span class="s2">&quot;121000005l35120456.node1&quot;</span> <span class="s2">&quot;330597659476689954.node6&quot;</span> 
</code></pre></div>
</li>
<li>
<p>ip与port的配置</p>
<ul>
<li>非<strong>NAT</strong>或非<strong>docker</strong>环境下使用如下配置（hostname为主机IP，port为节点之间P2P通信端口），修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-41-1" name="__codelineno-41-1" href="#__codelineno-41-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-41-2" name="__codelineno-41-2" href="#__codelineno-41-2"></a><span class="w">    </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-41-3" name="__codelineno-41-3" href="#__codelineno-41-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-41-4" name="__codelineno-41-4" href="#__codelineno-41-4"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">    </span><span class="err">#</span><span class="w"> </span><span class="err">局域网ip</span><span class="w"></span>
<a id="__codelineno-41-5" name="__codelineno-41-5" href="#__codelineno-41-5"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                   </span><span class="err">#</span><span class="w"> </span><span class="err">通信端口，可自由指定</span><span class="w"></span>
<a id="__codelineno-41-6" name="__codelineno-41-6" href="#__codelineno-41-6"></a><span class="w">     </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-41-7" name="__codelineno-41-7" href="#__codelineno-41-7"></a><span class="w">  </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的3个节点的端口配置情况（种子节点\&lt;seed-nodes>处配置3个即可，注意对应种子节点所配置的通信端口），其他节点的端口配置类似（其他节点主要是修改自己的<code>hostname</code>与<code>port</code>）</p>
<p><strong>注</strong>：种子节点指的是在网节点，如果创世节点启动，那么其种子节点配置项\&lt;seed-nodes>配置自己的ip和port即可，如果是其他节点想要加入已经存在的网络，那么其种子节点的配置项\&lt;seed-nodes>需要配置已经在网络中的节点的ip和端口</p>
<p><img alt="ip-port-1" src="../img/ip-port-1.jpg" /></p>
<p><img alt="ip-port-2" src="../img/ip-port-2.jpg" /></p>
<p><img alt="ip-port-3" src="../img/ip-port-3.jpg" /></p>
<ul>
<li><strong>NAT</strong>环境使用如下配置，针对上述图形中的artery部分修改即可，然后将种子节点设为相应节点的外部地址，修改conf目录下对应节点的system.conf文件中如下：</li>
</ul>
<div class="highlight"><pre><span></span><code><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a><span class="w">  </span><span class="err">remo</span><span class="kc">te</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-2"></a><span class="w">      </span><span class="err">#ar</span><span class="kc">ter</span><span class="err">y模式下的配置，设置的是自己节点的地址和端口</span><span class="w"></span>
<a id="__codelineno-42-3" name="__codelineno-42-3" href="#__codelineno-42-3"></a><span class="w">      </span><span class="err">ar</span><span class="kc">ter</span><span class="err">y</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<a id="__codelineno-42-4" name="__codelineno-42-4" href="#__codelineno-42-4"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;139.10.1.3&quot;</span><span class="w">   </span><span class="err">#</span><span class="w"> </span><span class="err">外部地址</span><span class="w"></span>
<a id="__codelineno-42-5" name="__codelineno-42-5" href="#__codelineno-42-5"></a><span class="w">          </span><span class="err">ca</span><span class="kc">n</span><span class="err">o</span><span class="kc">n</span><span class="err">ical.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                   </span><span class="err">#</span><span class="w"> </span><span class="err">外部端口</span><span class="w"></span>
<a id="__codelineno-42-6" name="__codelineno-42-6" href="#__codelineno-42-6"></a><span class="w">           </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.hos</span><span class="kc">tna</span><span class="err">me</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="s2">&quot;192.168.2.136&quot;</span><span class="w">        </span><span class="err">#</span><span class="w"> </span><span class="err">局域网地址</span><span class="w"></span>
<a id="__codelineno-42-7" name="__codelineno-42-7" href="#__codelineno-42-7"></a><span class="w">           </span><span class="err">bi</span><span class="kc">n</span><span class="err">d.por</span><span class="kc">t</span><span class="w"> </span><span class="err">=</span><span class="w"> </span><span class="mi">8082</span><span class="w">                       </span><span class="err">#</span><span class="w"> </span><span class="err">局域网端口</span><span class="w"></span>
<a id="__codelineno-42-8" name="__codelineno-42-8" href="#__codelineno-42-8"></a><span class="w">       </span><span class="p">}</span><span class="w"></span>
<a id="__codelineno-42-9" name="__codelineno-42-9" href="#__codelineno-42-9"></a><span class="w">  </span><span class="p">}</span><span class="w"></span>
</code></pre></div>
<p>下面列举5节点身份链网络中的<strong>3</strong>个节点的端口配置情况（种子节点处这里配置了<strong>1</strong>个），其他节点的端口配置类似（其他节点主要是修改自己的<strong>内部或外部</strong>的<code>hostname</code>与<code>port</code>）</p>
<p><img alt="ip-port-1" src="../img/ip-port-4.jpg" /></p>
<p><img alt="ip-port-5" src="../img/ip-port-5.jpg" /></p>
<p><img alt="ip-port-6" src="../img/ip-port-6.jpg" /></p>
</li>
<li>
<p><strong><font color=#FF0000>jar包部署后（分布式多机多节点）的目录类似下图，以<code>node1</code>和<code>node6</code>为例，其他节点类似：</font></strong></p>
</li>
</ul>
<blockquote>
<p>注：其中mytruststore.jks中存放了网络内所有节点的证书，各个服务器节点部署目录下mytruststore.jks一致</p>
</blockquote>
<p><img alt="deploy-single-folder" src="../img/deploy-multichain-single-folder.png" /></p>
<ul>
<li><strong>可能出现的问题</strong><ul>
<li>leveldbjni相关的错误，在windows下可能是没有c++环境导致的，装<a href="https://docs.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#visual-studio-2010-vc-100-sp1-no-longer-supported">Microsoft Visual C++ 2010 x64 Redistributable</a>即可</li>
<li>出现节点加入网络失败的情况<ul>
<li>可能是防火墙或者端口(种子节点或者本节点)没开放，可以手动查看或者使用nmap扫描对应的端口</li>
<li>可能是相应的节点证书没有放入到mytrustkeystore.jks，导致TLS连接失败</li>
</ul>
</li>
<li>磁盘空间不足的错误，有如下两个可能的原因：<ul>
<li>确实是磁盘空间不足，修改system.conf中的配置项<code>diskspaceManager.diskspacealarm</code></li>
<li>用户权限不够，即用户不具有在所配置存储目录下的读写的权限 </li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="_25">附录</h3>
<h4 id="_26">创世块的构建</h4>
<p>要分别构建身份链和业务链的创世块，运行<code>src/main/scala</code>目录下<code>rep.utils.identity.CreateIdentityGenesisInfo</code> （身份链） 和<code>rep.utils.credence.CreateCredenceGenesisInfo</code>（业务链），生成的创世块文件分别在<code>json/identity-net/genesis.json</code>（身份链）和<code>json/credence-net/genesis.json</code>（业务链）</p>
<h4 id="_27">节点密钥替换</h4>
<p>默认为5个身份链节点和5个业务链节点，每个节点有一个密钥对，<strong>实际</strong>在生产环境部署RepChain需要更换开源仓库中的密钥，使用<a href="https://keystore-explorer.org/">KeyStoreExplorer</a>（或者使用<a href="https://gitee.com/BTAJL/ToolCollection/blob/master/src/main/java/repchain/genjks/GenerateJks.java">代码</a>）即可生成密钥对，导出证书</p>
<ul>
<li>
<p>对于身份链</p>
<ul>
<li>1.为每个节点替换密钥，假设有5个节点，则使用<strong>kse</strong>生成5个包含密钥对（默认使用<code>secp256r1</code>）的<code>jks</code>并导出证书，更换<code>jks/identity-net</code>目录下的密钥与证书</li>
<li>2.使用<code>kse</code>将各个节点的证书导入到<code>mytrustStore.jks</code>中</li>
<li>3.运行<code>src/main/scala</code>目录下<code>rep.utils.identity.CreateIdentityGenesisInfo</code>，重新生成的身份链创世块文件在<code>json/identity-net/genesis.json</code>（身份链）</li>
</ul>
</li>
<li>
<p>对于业务链</p>
<ul>
<li>1.为每个节点替换密钥，假设有5个节点，则使用<strong>kse</strong>生成5个包含密钥对（默认使用<code>secp256r1</code>）的<code>jks</code>并导出证书，更换<code>jks/credence-net</code>目录下的密钥与证书</li>
<li>2.使用<code>kse</code>将各个节点的证书导入到<code>mytrustStore.jks</code>中</li>
<li>3.运行<code>src/main/scala</code>目录下<code>rep.utils.credence.CreateCredenceGenesisInfo</code>，重新生成的业务链创世块文件在<code>json/credence-net/genesis.json</code>（业务链）</li>
</ul>
</li>
</ul>

              
            </article>
          </div>
        </div>
        
          <a href="#" class="md-top md-icon" data-md-component="top" data-md-state="hidden">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
            回到页面顶部
          </a>
        
      </main>
      
        <footer class="md-footer">
  
    <nav class="md-footer__inner md-grid" aria-label="页脚">
      
        
        <a href="../RepChain-2.0/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 功能介绍" rel="prev">
          <div class="md-footer__button md-icon">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
          </div>
          <div class="md-footer__title">
            <div class="md-ellipsis">
              <span class="md-footer__direction">
                上一页
              </span>
              功能介绍
            </div>
          </div>
        </a>
      
      
    </nav>
  
  <div class="md-footer-meta md-typeset">
    <div class="md-footer-meta__inner md-grid">
      <div class="md-copyright">
  
    <div class="md-copyright__highlight">
      Copyright &copy; 2021-2022 RepChain V2.0
    </div>
  
  
    Made with
    <a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
      Material for MkDocs
    </a>
  
</div>
      
    </div>
  </div>
</footer>
      
    </div>
    <div class="md-dialog" data-md-component="dialog">
      <div class="md-dialog__inner md-typeset"></div>
    </div>
    <script id="__config" type="application/json">{"base": "..", "features": ["content.code.annotate", "search.highlight", "navigation.top"], "search": "../assets/javascripts/workers/search.2a1c317c.min.js", "translations": {"clipboard.copied": "\u5df2\u590d\u5236", "clipboard.copy": "\u590d\u5236", "search.config.lang": "ja", "search.config.pipeline": "trimmer, stemmer", "search.config.separator": "[\\uff0c\\u3002]+", "search.placeholder": "\u641c\u7d22", "search.result.more.one": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.more.other": "\u5728\u8be5\u9875\u4e0a\u8fd8\u6709 # \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.none": "\u6ca1\u6709\u627e\u5230\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.one": "\u627e\u5230 1 \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.other": "# \u4e2a\u7b26\u5408\u6761\u4ef6\u7684\u7ed3\u679c", "search.result.placeholder": "\u952e\u5165\u4ee5\u5f00\u59cb\u641c\u7d22", "search.result.term.missing": "\u7f3a\u5c11", "select.version.title": "\u9009\u62e9\u5f53\u524d\u7248\u672c"}}</script>
    
    
      <script src="../assets/javascripts/bundle.748e2769.min.js"></script>
      
    
  </body>
</html>